Estoy tratando de entender cuándo usar self.method_name frente a cuándo usar Classname.method_name.Intentando entender el uso de self.method_name vs. Classname.method_name en Ruby
En el ejemplo siguiente, ¿por qué "before_create" necesita hacer referencia a "User.hash_password" en lugar de "self.hash_password" o simplemente "hash_password"?
Como ya estamos en la clase de usuario, pensé que el método before_create "sabría" que "hash_password" es un miembro de su propia clase y no necesitaría ninguna sintaxis especial para referirse a él.
require 'digest/sha1'
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :password
validates_presence_of :name, :password
validates_uniqueness_of :name
def before_create
self.hashed_password = User.hash_password(self.password)
end
def after_create
@password = nil
end
def self.login(name, password)
hashed_password = hash_password(password || "")
self.find(:first, :conditions => ["name = ? and hashed_password = ?", name, hashed_password])
end
def try_to_login
User.login(self.name, self.password)
end
private
def self.hash_password(password)
Digest::SHA1.hexdigest(password)
end
end
Dado que las últimas líneas definen def self.hash_password (contraseña), pensé que self.hash_contraseña hacía referencia a este método. Pero está diciendo que self.hash_password obtendría NoMethodError, aunque la definición del método diga "self". No puedo referirme a esto con "yo". ¡Confuso! –
self.hashed_password = llama a un escritor de atributos? Pero no definí un escritor de atributos. ¿Se creó uno automáticamente? –
self.hashed_password = probablemente esté definido por ActiveRecord para usted, si tiene una columna de base de datos llamada 'hashed_password'. – molf