Каково значение self в модели Rails и почему недоступны очевидные методы экземпляра?

У меня есть собственный метод доступа в моем приложении 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 (или в обоих )?

5
задан Gilles 'SO- stop being evil' 12 September 2012 в 12:01
поделиться