我的 rails 3.1.6 应用程序中有一个自定义访问器方法,它为属性分配一个值,即使该值不存在。my_attr 属性是一个序列化哈希,除非指定了空白值,否则它应该与给定值合并,在这种情况下,它会将当前值设置为空白值。(添加了检查以确保值是它们应有的值,但为简洁起见将其删除,因为它们不是我的问题的一部分。)我的 setter 定义为:
def my_attr=(new_val)
cur_val = read_attribute(:my_attr) #store current value
#make sure we are working with a hash, and reset value if a blank value is given
write_attribute(:my_attr, {}) if (new_val.nil? || new_val.blank? || cur_val.blank?)
#merge value with new
if cur_val.blank?
write_attribute(:my_attr, new_val)
else
write_attribute(:my_attr,cur_val.deep_merge(new_val))
end
read_attribute(:my_attr)
end
此代码按原样运行良好,但在我使用 self.write_attribute() 时却不行。然后我收到以下错误:
NoMethodError:
private method `write_attribute' called for #<MyModel:0x00000004f10528>
因此,我的问题是:让 write_attribute 可用于实例似乎更合乎逻辑,那么为什么它仅可用于类而不可用于实例?我在 Ruby 或 Rails(或两者兼有)中对自我的基本了解是否有所欠缺?