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

Что делает # self.included(base) в Ruby on Rails "Restful Authentication"?

Я думал, что мы будем делать

helper_method :current_user, :logged_in?, :authorized?

чтобы эти методы контроллера были доступны для использования в качестве вспомогательных методов в представлениях. Но в Restful Authentication lib/authenticated_system.rb я вижу:

# Inclusion hook to make #current_user and #logged_in?
# available as ActionView helper methods.
def self.included(base)
  base.send :helper_method, :current_user, :logged_in?, :authorized? if base.respond_to? :helper_method
end

Почему это делается так, а не одна? Кроме того, я не вижу, что included называется где угодно.

4b9b3361

Ответ 1

Функция self.included вызывается, когда модуль включен. Он позволяет выполнять методы в контексте базы (где включен модуль).

Дополнительная информация: учебник ruby ​​mixin.

Ответ 2

Когда метод AuthenticatedSystem включен с использованием метода include, метод self.included запускается с тем, что он был включен в аргумент base.

Код, который вы показали, вызывает helper_method и определяет некоторые полезные помощники, но только если base имеет метод helper_method.

Это сделано так, так что в том числе модуль может настроить вспомогательные методы, а также добавить дополнительные методы в класс.

Ответ 3

По той же причине, о которой упомянул Питер, я хотел бы добавить пример, чтобы разработчики-новички легко поняли self.included(base) и self.extended(base):

module Module1
 def fun1
    puts "fun1 from Module1"
 end

 def self.included(base)
    def fun2
        puts "fun2 from Module1"
    end
 end
end

module Module2
 def foo
    puts "foo from Module2"
 end

 def self.extended(base)
    def bar
        puts "bar from Module2"
    end
 end
end


class Test
include Module1
extend Module2
 def abc
    puts "abc form Test"
 end
end

Test.new.abС# = > abc form Test

Test.new.fun1 # = > fun1 из модуля 1

Test.new.fun2 # = > fun2 из Module1

Test.foo # = > foo из Module2

Test.bar # = > bar из модуля 2

extend: методы будут доступны как методы класса

include: методы будут доступны как методы экземпляра

"base" в self.extended(base)/self.included(base):

Базовый параметр в статическом расширенном методе будет либо объектом экземпляра, либо объектом класса этого класса, который расширил модуль в зависимости от того, расширяете ли вы объект или класс соответственно.

Когда класс включает модуль, будет активирован метод self.included. Базовый параметр будет объектом класса для класса, который включает в себя модуль.

Ответ 4

Поскольку это первый результат при поиске в Google "self.included(base)", я попытаюсь привести небольшой пример того, как он работает. Я не знаю, насколько он отличается от подхода с остальной аутентификацией.

В основном он используется для создания методов из одного модуля, доступного в другом модуле.

module One
  def hello
    puts 'hello from module One'
  end
end

module Two
  def self.included(base)
    base.class_eval do
      include One
    end
  end
end

class ExampleClass
  include Two
end

ExampleClass.new.hello # => hello from module One