在嵌套资源中自动添加父模型ID
使用Rails 3中的嵌套资源路由,如下所示:
resources :magazines do resources :ads end
我已经定义了诸如magazine_ad_path
类的助手,我必须同时传递杂志和广告,如果我只是引用了广告,这是不方便的:
magazine_ad_path(@ad.magazine, @ad)
有没有一种很好的方法来设置一个ad_path
帮助器,它接受@ad
并返回包含杂志ID的相应地址? (这样也可以使用link_to @ad
, redirect_to @ad
等,它会自动调用与模型类对应的ad_path
助手。)
浅路由似乎是你正在寻找的。 您可以实现浅嵌套,如下所示:
resources :magazines do shallow do resources :ads end end
要么
resources :magazines, :shallow => true do resources :ads end
仅嵌套索引和新操作。
使用嵌套资源往往会生成长URL,浅嵌套有助于删除某些操作不一定需要的部分(包含父资源路由)(因为父资源可以从持久化子记录派生)。
一个可能但丑陋的解决方案是:
module RoutesHelper def ad_path(ad) magazine_ad_path(ad.magazine, ad) end def ad_url(ad) magazine_ad_url(ad.magazine, ad) end def edit_ad_path(ad) edit_magazine_ad_path(ad.magazine, ad) end def edit_ad_url(ad) edit_magazine_ad_url(ad.magazine, ad) end ... end [ActionView::Base, ActionController::Base].each do |m| m.module_eval { include RoutesHelper } end
不幸的是,这有一个缺点,我必须为_path
和_url
定义不同的帮助器,因为redirect_to
使用_url
助手,我必须手动编写edit_
助手(也许我错过了一些;不确定那个),它只是简单丑陋。
我想在这种情况下使用的一个解决方案是让实例返回自己的路径,如下所示:
class Ad def path action=nil [action, magazine, self] end end
然后在您的视图中,您可以将此数组用作多态路径:
link_to @ad.path link_to @ad.path(:edit)
当然它也适用于redirect_to等