Próbuję zrozumieć, kiedy użyć self.method_name vs. kiedy używać Classname.method_name.Próba zrozumienia użycia self.method_name vs. Classname.method_name w Ruby
W poniższym przykładzie, dlaczego "before_create" musi odnosić się do "User.hash_password" zamiast "self.hash_password" lub po prostu "hash_password"?
Ponieważ jesteśmy już w klasie User, myślałem, że metoda before_create "wie", że "hash_password" jest członkiem własnej klasy i nie potrzebuje specjalnej składni, aby się do niej odwoływać.
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
Ponieważ w ostatnich kilku wierszach definiuje się def self.hash_hasword (hasło), pomyślałem, że self.hash_password odnosi się do tej metody. Ale mówisz, że self.hash_password dostanie NoMethodError - nawet jeśli definicja metody mówi "self". Nie mogę nazywać tego "własnym". Mylące! –
self.hashed_password = wywołuje pisarz atrybutów? Ale nie zdefiniowałem pisarza atrybutów. Czy został utworzony automatycznie? –
self.hashed_password = jest prawdopodobnie zdefiniowany przez ActiveRecord dla ciebie, jeśli masz kolumnę bazy danych o nazwie "hashed_password". – molf