在嵌套资源中自动添加父模型ID

使用Rails 3中的嵌套资源路由,如下所示:

resources :magazines do resources :ads end 

我已经定义了诸如magazine_ad_path类的助手,我必须同时传递杂志和广告,如果我只是引用了广告,这是不方便的:

 magazine_ad_path(@ad.magazine, @ad) 

有没有一种很好的方法来设置一个ad_path帮助器,它接受@ad并返回包含杂志ID的相应地址? (这样也可以使用link_to @adredirect_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等