Подтвердить что ты не робот

Почему модуль InstanceMethods устарел?

Я люблю ActiveSupport:: Концерн.

Это упрощает добавление функциональности в ваши классы с хорошим синтаксисом.

В любом случае, в Rails 3.2 модуль InstanceMethods устарел. Если я правильно понял, , мы должны просто определить наши методы в блоке included (фактически это только в теле модуля):

# edit: don't do this! The method definition should just be in the body of the module
included do
    def my_method; end
end

Мне просто интересно, знает ли кто, почему они решили это сделать?

4b9b3361

Ответ 1

Посмотрите на пример, который вы связали первым.

module TagLib
  extend ActiveSupport::Concern

  module ClassMethods
    def find_by_tags()
      # ...
    end
  end

  module InstanceMethods
    def tags()
      # ...
    end
  end 
end

Когда вы включаете TagLib в свой класс, AS Concern автоматически расширяет класс с помощью модуля ClassMethods и включает в себя модуль InstanceMethods.

class Foo
  include TagLib
  # is roughly the same as
  include TagLib::InstanceMethods
  extend TagLib::ClassMethods
end

Но, как вы заметили, мы уже включаем сам модуль TagLib, поэтому методы, определенные в нем, уже доступны как методы экземпляра для класса. Почему вы хотите иметь отдельный модуль InstanceMethods?

module TagLib
  extend ActiveSupport::Concern

  module ClassMethods
    def find_by_tags()
      # ...
    end
  end

  def tags()
    # ...
  end
end

class Foo
  include TagLib
  # does only `extend TagLib::ClassMethods` for you
end