【发布时间】:2012-07-12 18:14:04
【问题描述】:
我的 rails 3.1.6 应用程序中有一个自定义访问器方法,它为属性分配一个值,即使该值不存在。my_attr 属性是一个序列化的哈希,除非为空白,否则它应该与给定的值合并value 被指定,在这种情况下,它会将当前值设置为空白值。 (添加了检查以确保值是它们应有的值,但为简洁起见将其删除,因为它们不是我的问题的一部分。)我的 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(或两者)中 self 的基本知识有什么不足吗?
【问题讨论】:
标签: ruby-on-rails ruby self