Миксины Rails, использующие ActiveSupport::Concern, не работают

У меня есть следующий модуль/класс, определенный в моей папке lib

module Service::Log
  extend ActiveSupport::Concern

  module ClassMethods
    def logger
      Rails.logger
    end
  end
end


class Service::MyService
  include Service::Log
end

Когда я пытаюсь вызвать метод logger через экземпляр объекта, я получаю сообщение об ошибке - NoMethodError: неопределенный метод `logger' для - Service::MyService:0x007fdffa0f23a0

Service::MyService.new.logger

Что я делаю неправильно? Я использую Rails 4.0.2.


person kapso    schedule 04.12.2013    source источник


Ответы (1)


Вы определяете метод регистратора как метод класса, а не как обычный метод. Это должно работать:

module Service::Log
  extend ActiveSupport::Concern

  def logger
    Rails.logger
  end
end

class Service::MyService
  include Service::Log
end

Service::MyService.new.logger

То, как вы определяли метод ранее, позволяло вам напрямую использовать метод регистратора в классе, например:

Service::MyService.logger
person Ju Liu    schedule 04.12.2013
comment
Спасибо, что я могу обойтись без расширения ActiveSupport::Concern, зачем мне ActiveSupport::Concern? - person kapso; 05.12.2013
comment
Просто потому, что он добавляет немного сахара поверх модулей Ruby: например, он автоматически включает методы из модуля ClassMethods в ваш класс. Посетите api.rubyonrails.org/classes/ActiveSupport/Concern.html, чтобы узнать больше. подробности - person Ju Liu; 05.12.2013
comment
Если вам интересно, как работает Concern и какие проблемы он решает, я написал подробное объяснение здесь: monkeyandcrow .com/blog/reading_rails_concern - person Adam Sanderson; 12.01.2014