Sto cercando di capire quando utilizzare self.method_name e quando utilizzare Classname.method_name.Tentativo di comprendere l'uso di self.method_name rispetto a Classname.method_name in Ruby
Nell'esempio seguente, perché "before_create" deve fare riferimento a "User.hash_password" anziché a "self.hash_password" o semplicemente "hash_password"?
Dato che siamo già nella classe User, ho pensato che il metodo before_create avrebbe "saputo" che "hash_password" è un membro della sua stessa classe e non avrebbe bisogno di alcuna sintassi speciale per farvi riferimento.
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
Poiché le ultime righe definiscono def self.hash_password (password), ho pensato che self.hash_password faceva riferimento a questo metodo. Ma stai dicendo che self.hash_password otterrebbe un NoMethodError - anche se la definizione del metodo dice "self". Non posso riferirmi a "sé". Confusione! –
self.hashed_password = chiama un attributo writer? Ma non ho definito uno scrittore di attributi. È stato creato automaticamente? –
self.hashed_password = è probabilmente definito da ActiveRecord per te, se hai una colonna di database chiamata 'hashed_password'. – molf