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

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

class Line  true end class Education  :item end class Work  :item end 

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

  

帮助者将为此工作。 但是,这需要我在控制器中检查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]引用一个Line,但你也会有params[:work_id]params[:education_id] 。 在这里你必须在检查传递哪个参数之间做出选择,或者至少解析所请求的url以确定你在哪个(工作,教育等等)。

希望这有帮助;)

编辑:

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

如果你像这样使用它们是有道理的:

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

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

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

干杯,
一个。