使用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
帮助器。)
答案 0 :(得分:2)
Shallow Routing似乎是您正在寻找的。您可以实现浅嵌套,如下所示:
resources :magazines do
shallow do
resources :ads
end
end
或强>
resources :magazines, :shallow => true do
resources :ads
end
仅嵌套索引和新操作。
使用嵌套资源往往会生成长URL,浅嵌套有助于删除某些操作不一定需要的部分(包含父资源路由)(因为父资源可以从持久化子记录派生)
答案 1 :(得分:0)
一个可能但丑陋的解决方案是:
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_
1}}手动帮助(也许我错过了一些;不确定),这只是简单的丑陋。
答案 2 :(得分:0)
我想在这种情况下使用的一个解决方案是让实例返回自己的路径,如下所示:
class Ad
def path action=nil
[action, magazine, self]
end
end
然后在您的视图中,您可以将此数组用作多态路径:
link_to @ad.path
link_to @ad.path(:edit)
当然它也适用于redirect_to等