【问题标题】:Virtual attributes Rails - Unknown Attribute Error虚拟属性 Rails - 未知属性错误
【发布时间】:2015-09-22 14:03:04
【问题描述】:

我正在制作一个 Rails 4 应用程序。每个incident 都属于一个user。每个事件has many events。我希望我可以使用current_user.incidents.new 创建一个事件并将其传递给事件模型中存在的属性message。在创建时,我希望使用上述message 创建一个新事件。

这是我的事件模型。

class Incident < ActiveRecord::Base
  # The 'incident' model.
  # Incidents are created by Users (belongs_to :user)
  # Incidents may be public or private.
  # Incidents have many events (identified, fixing, etc.)

  belongs_to :user
  has_many :events
  validates :name, presence: true, length: {maximum: 256}
  validates_presence_of :component
  validates_presence_of :public
  validates_presence_of :user_id

  attr_accessor :message
  validates_associated :message, presence: true

  def message
    Event.find_by_incident_id(self.id).message
  end

  def message=(value)
    self.events.new(message: value, status: self.status)
  end

  private
    def incident_params
      params.require(:incident).permit(:name, :status, :user_id, :message)
    end

end

但是,当我运行@i = Incident.new(message: 'something') 时,我得到ActiveRecord::UnknownAttributeError: unknown attribute 'message' for Incident.

请帮我解决这个问题。

【问题讨论】:

  • 您将需要accepts_nested_attributes_for,以便事件知道如何处理此属性。那么您的params 应该是.permit(:name,:status,:user_id,event_attributes: [ :message ]) 这还需要更改您的表单以使用引用新事件的fields_for。 This Tutorial 可能比我的解释更有帮助。

标签: ruby-on-rails ruby ruby-on-rails-4 virtual-attribute


【解决方案1】:

问题是您将值传递给Incident 的默认ActiveRecord::new 方法,它不会关心您的getter、setter 和访问器,它是goes straight to the columns。

有些人覆盖或改编build method,可以实现您需要的智能逻辑,而不会影响基本initialize 方法。

【讨论】:

  • 谢谢。这节省了我的时间。
【解决方案2】:

因为您的Incident 模型继承自 ActiveRecord::Base,所以它继承了构造函数。 ActiveRecord 构造函数只接受模型属性(db 列)作为参数。您正在尝试调用任意实例方法。您可以创建一个创建实例然后添加消息的类方法:

def self.create_with_message(msg)
   i = Incident.new
   i.message(msg)
   return(i)
end

【讨论】:

  • 谢谢。但我对马特的回答更满意。看起来更干净。但即使这样也行。
猜你喜欢
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多