Let's say I have a Magazine
model and Ad
model, such that Magazine :has_many => :ads
. I have setup my nested resource routing as follows:
resources :magazines do
resources :ads, :shallow => true do
get 'search', :action => :search, :on => :collection
end
end
My goal here is to be able to access the default CRUD routes created by Rails resources, plus a search route, on both a nested and shallow level. I want the user to be able to restrict his search from within the context of a given Magazine, or search all Ads regardless of parent Magazine, because some Ads won't have parent Magazines. In other words, I want to be able to:
/magazines/1/ads/new
/ads/new
/magazines/1/ads/search
/ads/search
# ... all standard CRUD routes ...
My concern is that the path variables in the views rely on things like new_magazine_ad_path(@magazine)
. Won't accessing a route like /ads/index
(which should contain a link to create a new ad) break on encountering the new_magazine_ad_path(@magazine)
helper without any @magazine
instance to guide it?
P.S.: Normally, I would try all this out myself to see what worked, but I'm stuck right now with the above setup - I can only reach the edit, delete, show, and update shallow routes:
/ads/:id
/ads/:id/edit
/ads/:id (put)
/ads/:id (delete)
and no new or index routes:
/ads/index
/ads/new
Update
So Shreyas proposed creating two controllers, one to handle the nested Ad, and one to handle the shallow Ad. This makes sense, but it leaves me duplicating all the view code just to change the path helpers from magazine_ad_path(@magazine)
to ad_path
. Any ideas on a DRY'er approach to handling the view changes? All the other view code is identical.