我有一个多态关联,如下所示:
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属于哪个父级,从而破坏了多态性的目的(如果是这种情况,我可以使用两个引用)。所以,我的问题是,我如何像普通的路径助手那样以多态方式工作?
答案 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_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/
干杯,
一个。