Как вы расширяете методы уровня класса для отдельного модуля в Rails? - PullRequest
3 голосов
/ 10 февраля 2010

Учитывая ситуацию, такую ​​как:

module Extension
  def self.included(recipient)
    recipient.extend(ModelClassMethods)
  end

  module ModelClassMethods
    def self.msg
      puts 'Hi from module'
    end
  end
end

class B
  include Extension
end

Почему B.msg недоступен?

>> B.msg
NoMethodError: undefined method `msg' for B:Class
    from (irb):16

Думаю ли я об этом неправильно? Не похоже, чтобы это было так сложно.

1 Ответ

4 голосов
/ 10 февраля 2010

Метод msg в вашем модуле ModelClassMethods должен быть объявлен как метод экземпляра, а не метод класса, потому что расширение класса получателя уже делает его методом класса. Итак:

module Extension 
  def self.included(recipient) 
    recipient.extend(ModelClassMethods) 
  end 

  module ModelClassMethods 
    def msg # Note lack of 'self.' 
      puts 'Hi from module' 
    end 
  end 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...