5

Estoy en los ferrocarriles simplemente practicando algunos rieles y me he topado con algo que trato de entender.¿Qué hace el yo en ruby ​​on rails?

No obtuve lo que estaba haciendo el "yo" en el método de autenticación. Así que lo he borrado y probé la entrada de mi aplicación para ver si sería una muestra de un error y lo hizo:

error: 

**NoMethodError in SessionsController#create 
undefined method `authenticate' for #<Class:0x00000102cb9000**> 

Realmente agradecería si alguien podría explicar exactamente lo que "Auto" está haciendo. Estaba tratando de averiguar exactamente qué estaba pasando, pero no puedo entenderlo.

El método se define en el modelo y se llama en sessions_controller .. He estado eliminando continuamente mi aplicación y comenzando desde cero para entenderlo y muchas cosas tienen sentido para mí cada vez que empiezo de nuevo, pero estoy atrapado en "sí mismo".

Soy el tipo de persona a la que le gusta entender por qué algo funciona.

controlador:

def create 
    user = User.authenticate(params[:email], params[:password]) 
    if user 
     session[:user_id] = user.id 
     redirect_to root_path, :notice => "Logged In" 
    else 
     flash.now.alert = "Invalid credentials" 
     render "new" 
    end 
    end 

modelo:

def self.authenticate(email, password) 
     user = find_by_email(email) 
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt) 
     user 
    else 
     nil 
    end 
    end 

Respuesta

13

Esta es una pregunta básica de Ruby. En este caso, self se usa para definir un método de clase.

class MyClass 
     def instance_method 
     puts "instance method" 
     end 

     def self.class_method 
     puts "class method" 
     end 
    end 

que se utilizan de esta manera:

instance = MyClass.new 
    instance.instance_method 

O:

MyClass.class_method 

esperanza de que aclara las cosas un poco.También se refieren a: http://railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/

+1

Extensión leve a su respuesta: 'def object.my_foo_method'. Define 'my_foo_method' en' obj'. En el contexto de su respuesta, 'self' es el objeto de la clase' Class' (es decir, la clase 'MyClass'). Por lo tanto, define el método en esa clase. – Swanand

+0

No se debe usar un signo '@' para las instancias, p. @instance = ...? –

+0

dado que son rieles y que probablemente se usen en la vista –

2
class User 
    def self.xxx 
    end 
end 

es una manera de definir método de clase mientras

class User  
    def xxx 
    end 
end 

definirá un método de instancia.

Si se elimina. Del def, obtendrá un método que no se encuentra el error cuando lo hace

User.authenticate 

porque está intentando llamar a un método en una clase en lugar de una instancia de la clase. Para usar un método de instancia, necesita una instancia de una clase.

4

self define un método de la clase en lugar de la ejemplo de la clase. Así que con def self.authenticate puede hacer lo siguiente:

u = User.authenticate('[email protected]','[email protected]') 

En vez de hacer ...

u = User.new 
u.authenticate('[email protected]','[email protected]') 

esta manera, usted no tiene que crear una instancia de usuario para autenticar una.

+0

Aparte de evitar la necesidad de instanciar una clase para utilizar un método, ¿existen otras razones para definir métodos de clase en lugar de métodos de instancia? – LazerSharks

3

En aras de terminación y para frustrar futuros dolores de cabeza, me gustaría también señalar que los dos son equivalentes:

class User 
    def self.authenticate 
    end 
end 

class User 
    def User.authenticate 
    end 
end 

cuestión de preferencia.