I started using ActiveAdmin recently in a project and almost everything works great but I’m having a problem when using it in combination with the friendly_id gem. I’m getting ActiveRecord::ReadOnlyRecord thrown for my forms [i believe] because of the friendly_id attribute whose ID is readonly:
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"Rc5PmUYZt3BiLvfPQr8iCPPXlbfgjoe/n+NhCwXazNs=",
"space"=>{"name"=>"The Kosmonaut",
"address"=>"8 Sichovykh Striltsiv 24",
"email"=>"info@somedomain.com"},
"commit"=>"Update Space",
"id"=>"the-kosmonaut"} <--- culprit
I’m guessing the last line is the culprit as it’s a readonly attribute, it’s not in my form but rather in the PATH
http://localhost:5000/manage/spaces/the-kosmonaut/edit
How can I fix this from trying to update the ID?
Form from in ActiveAdmin looks like this:
form do |f|
f.inputs "Details" do
f.input :name
f.input :address
f.input :email
f.input :phone
f.input :website
end
f.inputs "Content" do
f.input :description
f.input :blurb
end
f.buttons
end
UPDATE: This doesn’t work either so it’s not the friendly_id?
I tried using @watson’s suggestion which should have worked but still got the same error ;-(
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"Rc5PmUYZt3BiLvfPQr8iCPPXlbfgjoe/n+NhCwXazNs=",
"space"=>{"name"=>"The Kosmonaut 23"},
"commit"=>"Update Space",
"id"=>"6933"}
http://localhost:5000/manage/spaces/6933/edit
When I check the record in the console with record.readonly? it returns false
UPDATE UPDATE: removing the scope_to fixes the problem.
scope_to :current_user, :unless => proc{ current_user.admin? }
Only problem is I need the scope_to to prevent users from seeing records they do not own. My guess is (as I’m assuming scope_to normally works with has_many) that my HABTM association causes some weirdness? Ie Users <– HABTM –> Spaces?
If you only want friendly ID’s in the front end and don’t care about them inside Active Admin, you can revert the effects of the friendly_id gem for your Active Admin controllers.
I don’t know exactly how friendly_id overrides the
to_parammethod, but if it’s doing it the normal way, re-overriding it inside all of your Active Admin controllers should fix it, e.g.:Even better you could create a before filter in the base Active Admin controller
ActiveAdmin::ResourceControllerso that it is automatically inherited into all your Active Admin controllers.First add the filter to the
config/initializers/active_admin.rbsetup:The open up
ActiveAdmin::ResourceControllerand add arevert_friendly_idmethod, E.g. by adding the following to the end ofconfig/initializers/active_admin.rb:Update: I just updated the last code example to handle controllers with no related model (e.g. the Active Admin Dashboard controller)
Update 2: I just tried using the above hack together with the friendly_id gem and it seems to work just fine 🙂
Update 3: Cleaned up the code to use the standard way of adding Active Admin before filters to the base controller