Ответ 1
Функция self.included
вызывается, когда модуль включен. Он позволяет выполнять методы в контексте базы (где включен модуль).
Дополнительная информация: учебник ruby mixin.
Я думал, что мы будем делать
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
называется где угодно.
Функция self.included
вызывается, когда модуль включен. Он позволяет выполнять методы в контексте базы (где включен модуль).
Дополнительная информация: учебник ruby mixin.
Когда метод AuthenticatedSystem
включен с использованием метода include
, метод self.included
запускается с тем, что он был включен в аргумент base
.
Код, который вы показали, вызывает helper_method
и определяет некоторые полезные помощники, но только если base
имеет метод helper_method
.
Это сделано так, так что в том числе модуль может настроить вспомогательные методы, а также добавить дополнительные методы в класс.
По той же причине, о которой упомянул Питер, я хотел бы добавить пример, чтобы разработчики-новички легко поняли 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. Базовый параметр будет объектом класса для класса, который включает в себя модуль.
Поскольку это первый результат при поиске в 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
Хотите выкапывать в self.included
и self.extended
?
Пожалуйста, смотрите здесь: https://ruby-doc.org/core-2.2.1/Module.html#method-i-included