在控制器中加载多态资源以构建嵌套的多态对象

时间:2014-02-27 20:49:29

标签: ruby-on-rails

我有一个看起来像这样的结构:

会议有一个about_module和一个speaker_module,具有多态关系

about_module和speaker_module都有多态关系的人

class Conference < ActiveRecord::Base
  has_one :about_module, as: :resource, dependent: :destroy
  accepts_nested_attributes_for :about_module

  has_one :speaker_module, as: :resource, dependent: :destroy
  accepts_nested_attributes_for :about_module
end


class AboutModule < ActiveRecord::Base
  belongs_to :resource, polymorphic: true

  has_many :people, as: :resource, dependent: :destroy
  accepts_nested_attributes_for :people, allow_destroy: true
end


class SpeakerModule < ActiveRecord::Base
  belongs_to :resource, polymorphic: true

  has_many :people, as: :resource, dependent: :destroy
  accepts_nested_attributes_for :people, allow_destroy: true
end


class Person < ActiveRecord::Base
  default_scope { order(:position) }
  belongs_to :resource, polymorphic: true
end

因此,当在PersonController中构建一个新人时,我现在需要在哪个模块上构建它。问题是我不知道如何访问父多态模型。

例如:

/管理/会议/:conference_id / speaker_module /人/新

/管理/会议/:conference_id / about_module /人/新

conference_id在param中传递,但我不知道它是哪个模块。

在PeopleController#new中,我想动态加载相应的模块,以便我可以调用

@person = module.people.build

当然我可以覆盖我的路由以包含模块的资源类型和ID,例如

/admin/conferences/:conference_id/:resource_type/:resource_id/people/new

但必须有更好的方法吗?

在路线中:

resources :conferences do

  resource :about_module do
    resources :people
  end

  resource :speaker_module do
    resources :people
  end
end

0 个答案:

没有答案