Trace: • caching_nested_forms
Caching Nested Forms
Normally, using a nested resource's url leads you to the controller of the “embedded” resource. E.g:
map.resources :guests, :has_many => :registrations
Produces:
guest_registrations GET /guests/:guest_id/registrations(.:format) {:controller=>"registrations", :action=>"index"} POST /guests/:guest_id/registrations(.:format) {:controller=>"registrations", :action=>"create"} new_guest_registration GET /guests/:guest_id/registrations/new(.:format) {:controller=>"registrations", :action=>"new"} edit_guest_registration GET /guests/:guest_id/registrations/:id/edit(.:format) {:controller=>"registrations", :action=>"edit"} guest_registration GET /guests/:guest_id/registrations/:id(.:format) {:controller=>"registrations", :action=>"show"} PUT /guests/:guest_id/registrations/:id(.:format) {:controller=>"registrations", :action=>"update"} DELETE /guests/:guest_id/registrations/:id(.:format) {:controller=>"registrations", :action=>"destroy"}
(You can output this yourself using rake routes
)
This is obviously bad if you want to use nested forms, where you need the controller to be the one for the parent object. In a nested form, the CRUD (Create, Read, Update, Delete) actions on the nested model are automatically handled for you, so there's no real need to access the nested model's controller.
map.resources :guests do |guest| guest.resources :registrations, :path_prefix => ':locale/guests/:guest_id', :controller => :guests end
This produces:
guest_registrations GET /guests/:guest_id/registrations(.:format) {:controller=>"guests", :action=>"index"} POST /guests/:guest_id/registrations(.:format) {:controller=>"guests", :action=>"create"} new_guest_registration GET /guests/:guest_id/registrations/new(.:format) {:controller=>"guests", :action=>"new"} edit_guest_registration GET /guests/:guest_id/registrations/:id/edit(.:format) {:controller=>"guests", :action=>"edit"} guest_registration GET /guests/:guest_id/registrations/:id(.:format) {:controller=>"guests", :action=>"show"} PUT /guests/:guest_id/registrations/:id(.:format) {:controller=>"guests", :action=>"update"} DELETE /guests/:guest_id/registrations/:id(.:format) {:controller=>"guests", :action=>"destroy"}
Now to be sure, following the example above you'll have to make distinction in your controller between cases where the registration id is known (all operations are on a specific registration), and where it is not (all operations pertain to a guest object). But you'd have to do that too if you were using a custom made “selected_registration_id”.
TO DO: include info on nested resources (routing)
You are here: start » ror » caching_nested_forms