使用具有嵌套关联的多态路径

时间:2010-06-30 01:46:25

标签: ruby-on-rails ruby polymorphic-associations

我有一个多态关联,如下所示:

class Line < ActiveRecord::Base
   belongs_to :item, :polymorphic => true
end

class Education < ActiveRecord::base
   has_many :lines, :as => :item
end

class Work < ActiveRecord::base
   has_many :lines, :as => :item
end

我想要一种从父项创建新行的简单方法。因此,我可能正在编辑Work对象的视图,并希望有一个创建新Line对象的链接。通常,我会这样做:

<%= link_to "New Line", new_work_line_path(@work) %>

帮助者将为此工作。但是,这需要我在控制器中检查Line属于哪个父级,从而破坏了多态性的目的(如果是这种情况,我可以使用两个引用)。所以,我的问题是,我如何像普通的路径助手那样以多态方式工作?

1 个答案:

答案 0 :(得分:7)

可能的方法是使用这样的路线:

map.resources :works do |works|
  works.resources :lines
end

map.resources :educations do |edu|
  edu.resources :lines
end

你的LinesController保持不变,你会得到这样的路线:

work_lines GET    /works/:work_id/lines
....
education_lines GET    /educations/:education_id/lines
...

最令人讨厌的部分是管理传递的第一个ID,因为您将params[:id]引用一行,但您还会params[:work_id]params[:education_id]。在这里你必须在检查传递哪个参数之间做出选择,或者至少解析所请求的网址以确定你在哪个(工作,教育等等)。

希望这有帮助;)

修改

根据评论中的内容,您可以使用polymorphic_url / polymorphic_pathhttp://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html):

如果你这样使用它们就有意义了:

link_to "New Line", polymorphic_url(@line.item,@line)
# => /<educations_or_works>/item_id/lines/line_id

至少,你甚至可以将它用于收藏:

link_to "New Line", polymorphic_url(@line.item,Line.new)
# => /<educations_or_works>/item_id/lines/

干杯,
一个。