У меня есть собственный метод доступа в моем приложении 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 _атрибут (). Затем я получаю следующую ошибку:
NoMethodError:
private method `write_attribute' called for #<MyModel:0x00000004f10528>
Таким образом, мои вопросы :кажутся более логичными, чтобы атрибут записи _был доступен для экземпляра, так почему же он доступен только для класса, а , а не для экземпляра? Чего-то не хватает в моих фундаментальных знаниях о себе в Ruby или Rails (или в обоих )?