Je pensais que nous ferions
helper_method :current_user, :logged_in?, :authorized?
pour rendre ces méthodes de contrôleur disponibles pour une utilisation en tant que méthodes d'assistance dans les vues. Mais dans lib/authenticated_system.rb
, Je vois:
# 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
Pourquoi est-il fait de cette façon au lieu de cette seule ligne? De plus, je ne vois pas included
être appelé n'importe où.
Le self.included
La fonction est appelée lorsque le module est inclus. Il permet aux méthodes d'être exécutées dans le contexte de la base (où le module est inclus).
Plus d'informations: a Ruby tutorial mixin .
Pour la même raison que Peter a mentionnée, je voudrais ajouter un exemple afin qu'il soit facile pour les développeurs débutants de comprendre self.included (base) et 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.abc # => abc form Test
Test.new.fun1 # => fun1 de Module1
Test.new.fun2 # => fun2 de Module1
Test.foo # => foo du Module2
Test.bar # => barre du Module2
extend: les méthodes seront accessibles en tant que méthodes de classe
include: les méthodes seront disponibles en tant que méthodes d'instance
"base" dans self.extended (base)/self.included (base):
Le paramètre de base dans la méthode étendue statique sera soit un objet d'instance, soit un objet de classe de la classe qui a étendu le module, selon que vous étendez respectivement un objet ou une classe.
Lorsqu'une classe comprend un module, la méthode self.included du module sera invoquée. Le paramètre de base sera un objet de classe pour la classe qui inclut le module.
Lorsque la méthode AuthenticatedSystem
est incluse à l'aide de la méthode include
, le self.included
est déclenchée avec tout ce qui a été inclus dans l'argument de base
.
Le code que vous avez affiché appelle helper_method
et définit quelques aides utiles, mais uniquement si base
a un helper_method
méthode.
C'est fait de cette façon, donc l'inclusion du module peut configurer les méthodes d'assistance ainsi que l'ajout de méthodes supplémentaires à la classe.
Comme c'est le premier résultat lors de la recherche sur Google de "self.included (base)", je vais essayer de donner un petit exemple sur la façon dont cela fonctionne. Je ne sais pas en quoi elle diffère de l'approche d'authentification reposante.
Il est essentiellement utilisé pour rendre les méthodes d'un module disponibles dans un autre module.
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
Vous voulez creuser dans self.included
et self.extended
?
Veuillez regarder ici: https://Ruby-doc.org/core-2.2.1/Module.html#method-i-included