У меня есть собственный метод доступа в моем приложении rails 3.1.6, который присваивает значение атрибуту, даже если значение отсутствует. Атрибут my_attr представляет собой сериализованный хэш, который должен быть объединен с заданным значением, если не указано пустое значение , и в этом случае для текущего значения будет установлено пустое значение. (Добавлены проверки, чтобы убедиться, что значения такие, какими они должны быть, но они удалены для краткости, поскольку они не являются частью моего вопроса.) Мой установщик определяется как:
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 (или в обоих)?