ruby-on-rails - knock - ruby on rails rest api authentication
¿Qué hace#self.included(base) en Ruby on Rails ''Restful Authentication? (5)
Pensé que haríamos
helper_method :current_user, :logged_in?, :authorized?
para hacer que estos métodos de controlador estén disponibles para su uso como métodos auxiliares en las vistas. Pero en lib/authenticated_system.rb
Restful Authentication veo:
# 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
¿Por qué se hace así en lugar de esa única línea? Además, no veo included
llamado en cualquier lugar.
¿Quieres self.included
en sí self.included
y self.extended
?
Mire aquí: https://ruby-doc.org/core-2.2.1/Module.html#method-i-included
Como es el primer resultado al buscar en Google "auto.incluido (base)" intentaré dar un pequeño ejemplo de cómo funciona. No sé cuánto difiere del enfoque de autenticación relajante.
Básicamente se utiliza para hacer que los métodos de un módulo estén disponibles en otro módulo.
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
Cuando el método AuthenticatedSystem
se incluye utilizando el método include
, el método self.included
se desencadena con lo que fue incluido en el argumento de base
.
El código que has mostrado llama a helper_method
y define algunos helpers útiles, pero solo si la base
tiene un método helper_method
.
Se hace de esa manera, por lo que incluir el módulo puede configurar los métodos de ayuda y agregar métodos adicionales a la clase.
La función self.included
se self.included
cuando el módulo está incluido. Permite que los métodos se ejecuten en el contexto de la base (donde se incluye el módulo).
Más información: un tutorial de ruby mixin .
Por la misma razón que Peter ha mencionado, me gustaría añadir un ejemplo para que sea fácil para los desarrolladores novatos entender self.included (base) y 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 desde Module1
Test.new.fun2 # => fun2 desde Module1
Test.foo # => foo desde Module2
Test.bar # => barra desde Module2
extender: los métodos serán accesibles como métodos de clase
include: los métodos estarán disponibles como métodos de instancia
" base " en self.extended ( base ) / self.included ( base ):
El parámetro base en el método extendido estático será un objeto de instancia o un objeto de clase de la clase que extendió el módulo dependiendo de si extiende un objeto o clase, respectivamente.
Cuando una clase incluye un módulo, se invocará el método self.included del módulo. El parámetro base será un objeto de clase para la clase que incluye el módulo.