我有一个多态关联,如下所示:
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属于哪个父类,从而达到多态的目的(如果是这样,我可以使用两个引用).所以,我的问题是,如何让路径像普通路径帮助器一样工作?
解决方法
一种可能的方式是使用这样的路由:
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].在这里,您必须选择检查哪个参数通过,或至少解析所请求的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",Line.new) # => /<educations_or_works>/item_id/lines/
干杯,一个.