simple rails knock ruby-on-rails restful-authentication

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.



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.