ruby-on-rails – 使用具有嵌套关联的多态路径

我有一个多态关联,如下所示:
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/

干杯,一个.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...