Я пытаюсь понять, когда использовать self.method_name и когда использовать Classname.method_name.Попытка понять использование self.method_name vs. Classname.method_name в Ruby
В приведенном ниже примере почему «before_create» необходимо ссылаться на «User.hash_password» вместо «self.hash_password» или просто «hash_password»?
Поскольку мы уже находимся в классе User, я думал, что метод before_create «знал бы», что «hash_password» является членом собственного класса и не нуждается в специальном синтаксисе для ссылки на него.
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
Поскольку последние несколько строк определяют def self.hash_password (пароль), я думал, что self.hash_password ссылается на этот метод. Но вы говорите, что self.hash_password получит NoMethodError - хотя определение метода говорит «я». Я не могу ссылаться на него с «я». Смешение! –
self.hashed_password = вызывает автора атрибута? Но я не определил автора атрибута. Был ли он автоматически создан? –
self.hashed_password =, вероятно, определен ActiveRecord для вас, если у вас есть столбец базы данных с именем hashed_password. – molf