web-dev-qa-db-fra.com

Que fait # self.included (base) dans Ruby on Rails 'Restful Authentication?

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ù.

51

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 .

96
nathanvda

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.

12
FaaduBaalak

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.

12
Ryan Bigg

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
5
Peter Piper

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

1
张健健