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

Zoe*_*Zoe 13 ruby ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

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

<%= link_to "New Line", new_work_line_path(@work) %>
Run Code Online (Sandbox Code Playgroud)

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

And*_*oni 7

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

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

map.resources :educations do |edu|
  edu.resources :lines
end
Run Code Online (Sandbox Code Playgroud)

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

work_lines GET    /works/:work_id/lines
....
education_lines GET    /educations/:education_id/lines
...
Run Code Online (Sandbox Code Playgroud)

最烦人的部分是管理传递的第一个id,因为你有一个params[:id]引用的Line,但你也会有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
Run Code Online (Sandbox Code Playgroud)

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

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

干杯,
一个.