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

时间:2011-03-28 17:22:11

标签: ruby-on-rails resources nested url-routing helper

使用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帮助器。)

3 个答案:

答案 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等