【问题标题】:Using polymorphic paths with nested associations使用具有嵌套关联的多态路径
【发布时间】:2010-06-30 01:46:24
【问题描述】:

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

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 在控制器中属于哪个父级,从而违背了多态性的目的(如果是这种情况,我可以使用两个引用)。所以,我的问题是,如何让路径像普通路径助手一样多态地工作?

【问题讨论】:

  • “我正在寻找一种方法,可以在视图中查看,比如说,一个工作对象,并创建新的 Line 进入其中。”这句话让我非常困惑。想改写吗?
  • 我将问题编辑得更清楚。

标签: ruby-on-rails ruby polymorphic-associations


【解决方案1】:

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

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 以确定您所在的位置(工作、教育等...)。

希望这会有所帮助;)

编辑:

根据cmets中出现的情况,可以使用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/

干杯,
一个。

【讨论】:

  • 这是一种方法,但它根本不是多态的。我在这方面发现了很多变体,似乎多态关联包含在 ActiveRecord 中,但在其他地方完全被遗忘了。我希望事实并非如此,我只是看错了地方。不过,如果我找不到其他任何东西,我会记住这一点。
  • 我向您展示了维护您的多态模型关联的路线。
  • 是的,但是路由的行为不是多态的,这正是我正在寻找的。路线特定于线路属于工作还是教育,就像控制器中的结果一样(:word_id 和 :education_id)。因为这两者都应该作为 Item 对象与行相关联,所以如果有一种方法可以在其中获取可以代表工作或教育的 :item_id 将是有意义的。
  • 谢谢 ^_^ 这是完美的答案。
  • 刚刚翻到这个....如果您仍在使用 Rails 2.3.x(在我的情况下为 2.3.5),那么调用该方法的正确方法是 polymorphic_path|url([@line .item, @line])...注意数组参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多