13

我有一个看起来像这样的多态关联:

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 在控制器中属于哪个父级,从而违背了多态性的目的(如果是这种情况,我可以使用两个引用)。所以,我的问题是,如何让路径像普通路径助手一样多态地工作?

4

1 回答 1

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]被引用的 Line,但你也会有params[:work_id]or params[:education_id]。在这里,您必须选择检查传递了哪个参数,或者至少解析请求的 url 以确定您所在的位置(工作、教育等)。

希望这有帮助;)

编辑:

根据评论中出现的内容,您可以使用polymorphic_url/ polymorphic_path( http://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/

干杯,
一个。

于 2010-06-30T11:14:51.973 回答