Можно ли получить доступ к значениям экземпляра в методе отсутствующей функции? - PullRequest
1 голос
/ 04 марта 2012

Я пытался написать свое первое method_missing переопределение, когда я продолжал сталкиваться с (отредактированными) уровнем стека слишком глубокими ошибками. Казалось, что главный виновник пытался использовать атрибут экземпляра. Например, если 'self' было экземпляром класса User, тогда проверяется что-то вроде:

def method_missing(name)
  if self.name
    # do stuff
  end
end

Будет ошибка. Я потратил много времени на это, но в итоге сдался. Должно быть что-то, чего я не понимаю в доступе к нему.

Редактировать

Приношу свои извинения, Эндрю прав, я получаю слишком большие ошибки на уровне стека. Имея это в виду, каков подходящий (если таковой имеется) способ доступа к значениям атрибутов экземпляров?

1 Ответ

1 голос
/ 04 марта 2012

Вы можете потенциально исправить эту проблему, убедившись, что self.name действительно существует:

def method_missing(name)
  if self.respond_to?(:name) && self.name
    # do stuff
  end
end

Обратите внимание, что может не работать , если ваш класс наследует от чего-либоRailsy (например, ActiveRecord::Base), поскольку он переопределяет respond_to?.

Если вы являетесь в классе Railsy, ​​ваш отсутствующий метод должен вызвать super, чтобы вы не потеряли много«магические» методы ActiveRecord (включая, вероятно, сам self.name):

def method_missing(name, *args, &block)
  if name_is_something_i_should_handle_here
    # do your stuff
  else
    super(name, *args, block) # call parent's method_missing
  end
end

Очевидно, вы должны заменить name_is_something_i_should_handle_here соответствующей логикой.

Вы также можете рассмотретьиспользование создания динамического метода вместо method_missing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...