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属于哪个父级,从而破坏了多态性的目的(如果是这种情况,我可以使用两个引用).所以,我的问题是,我如何像普通的路径助手那样以多态方式工作?
一种可能的方法是使用这样的路线:
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)
干杯,
一个.
| 归档时间: |
|
| 查看次数: |
4677 次 |
| 最近记录: |