Rails 4:无法更新多态对象

时间:2015-08-03 14:40:27

标签: ruby-on-rails ruby-on-rails-4 polymorphism rails-activerecord polymorphic-associations

我的对象 Item 的多态关联为 element (可以是视频,文字等)

当我想要更新 Item (及其 element )时,我会这样做:

@item.update_attributes(param_update_item)

我称之为:

def param_update_item

  params.permit(:name, :visible, :title, element: [:content, :url, :html])

  # params.permit(:name, :visible, :title) # - don't get error, but obviously don't ubdate the element

end

允许的参数很好,但是当调用update_attributes时,我收到错误:

 undefined method `primary_key' for ActionController::Parameters:Class

有什么想法吗?

编辑:

class Item < ActiveRecord::Base
  belongs_to :element, :polymorphic => true, dependent: :destroy
end

module Element
  included do
    has_one :item, :as => :element, dependent: :destroy
  end
end

和模型的例子(在我的例子中)

class Texte < ActiveRecord::Base
  include Element

  validates :content, :presence => true
end

我在DB中的项目:

class Item < ActiveRecord::Base {
          :id => :integer,
          :element_id => :integer,
          :element_type => :string,
 ....  }

当我item.element时,我得到:

 => <Texte id: 15757, content: "RE3  3232 /...", created_at: ...>

1 个答案:

答案 0 :(得分:0)

如果要使用项目更新元素,则应告诉模型您的项目应接受元素的嵌套属性。

module Element
  included do
    has_one :item, :as => :element, dependent: :destroy
    accepts_nested_attributes_for :element 
  end
end

但我认为您的关系设置可能不正确。你说你希望你的元素是多态的,但你的项目只属于元素。

我愿意

class Item < ActiveRecord::Base
  belongs_to :element
end
class Element < ActiveRecord::Base
  has_one :item
  belongs_to :elementable, polymorphic: true
  validates :content, presence: true
end
module Elementable
  extend ActiveSupport::Concern
  included do
    has_one :element, as: :elementable
    accepts_nested_attributes_for :element
  end
end
class Texte < ActiveRecord::Base
  include Elementable
end

然后在您的项目更新中,您可以允许

element_attributes: [# all your element attributes in here]

这将要求您将项目表更改为具有element_id并在迁移中添加元素表

create_table :elements do |t|
  t.belongs_to :elementable, polymorphic: true
end

这将创建名为elementable_type和elementable_id

的列

我会阅读此内容以获取更多信息Polymorphic Associations