Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > Помогите разобраться в модели


Автор: DimanLin 18.1.2009, 22:15
Код

class User < ActiveRecord::Base
 validates_presence_of :name                                                  
 validates_uniqueness_of :name, :message => "уже существует"

  validates_confirmation_of :password

  def validate
    errors.add_to_base("Пароль не введён") if hashed_password.blank?
  end

def password 
  @password
end

def password=(pwd)  
  @password = pwd
  create_new_salt
  self.hashed_password = User.encrypted_password(self.password, self.salt) 
end

def self.authenticate(name, password)
  user = self.find_bay_name(name)
  if user
    expected_password = encrypted_password(password, user.salt)
    if user.hashed_password != expected_password
      user = nil
    end
  end
  user
end

private
    def self.encrypted_password(password, salt)
      string_to_hash = password + "wibble" + salt
      Digest::SHA1.hexdigest(string_to_hash)
    end

    def create_new_salt
    self.salt = self.object_id.to_s + rand.to_s
  end
  
end


У меня несколько вопросов.

1.

def password 
  @password
end
Что это значит?

2. Что значит self.

3.
Как всё это происходит после контроллера, который содержит строки:
@user = User.new(params[:user])
@user.save
Где в модели происходит первый вызов которая хеширует пароль? И почему происходит этот вызов?

Автор: shine 18.1.2009, 23:24
1. @password - это член экземпляра класса User. Этот член недоступен вне класса. Для доступа к значению этой переменной создан метод password

2. Значение self зависит от контекста. Если self применяется в названии метода то этот метод будет методом класса а не методом экземпляра класса.
Внутри метода значение self тоже зависит от контекста. Если метод - метод экземпляра, то self указывает на экземпляр. Если метод - метод класса, то self указывает на класс.

3. Ничего не буду говорить. У человека который писал такой код должны были быть очень веские причины писать его именно таким образом. Лучше спросите у автора.

Автор: kronos_vano 19.1.2009, 08:22
где: def password=
почему: потому что @user = User.new(params[:user])
это я так понял плагин restful_authentification...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)