虚拟属性 Rails - 未知属性错误
Virtual attributes Rails - Unknown Attribute Error
我正在制作 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.
请帮我解决这个问题。
问题是您将值传递给 Incident
的默认 ActiveRecord::new
方法,它不会关心您的 getter、setter 和访问器,它 goes straight to the columns .
有些人重写或改编 build method 可以按照您的要求实现巧妙的逻辑,而不影响基本 initialize
方法。
因为您的 Incident
模型继承自 ActiveRecord::Base,它继承了构造函数。 ActiveRecord 构造函数只接受模型属性(数据库列)作为参数。您正在尝试调用任意实例方法。您可以创建一个 class 方法来创建一个实例,然后添加消息:
def self.create_with_message(msg)
i = Incident.new
i.message(msg)
return(i)
end
我正在制作 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.
请帮我解决这个问题。
问题是您将值传递给 Incident
的默认 ActiveRecord::new
方法,它不会关心您的 getter、setter 和访问器,它 goes straight to the columns .
有些人重写或改编 build method 可以按照您的要求实现巧妙的逻辑,而不影响基本 initialize
方法。
因为您的 Incident
模型继承自 ActiveRecord::Base,它继承了构造函数。 ActiveRecord 构造函数只接受模型属性(数据库列)作为参数。您正在尝试调用任意实例方法。您可以创建一个 class 方法来创建一个实例,然后添加消息:
def self.create_with_message(msg)
i = Incident.new
i.message(msg)
return(i)
end