Я следую итерации 13 разработки Agile Web для входа пользователя.
Я создаю миграцию, чтобы добавить в мою модель пользователя 2 столбца: hashed_password и salt.
- Творение пользователей работает
- вход не выполнен, из-за этой ошибки неопределенный метод 'hashed_password' в методе 'authenticate'
Проблема в том, что:
- В консоли rails я могу получить User.first.hashed_password, что выглядит нормально: -)
- Я вывел Пользователя, которого я вижу, и это НЕ ноль
- Я попытался вывести user.hashed_password, как я это делал в консоли rails, но это выдает всегда одну и ту же ошибку:
NoMethodError (неопределенный метод hashed_password' for #<ActiveRecord::Relation:0x00000003e6c3c0>):
app/models/user.rb:21:in
authenticate '
app / controllers / session_controller.rb: 6: в `create '
Это моя модель пользователя:
require 'digest/sha2'
class User < ActiveRecord::Base
has_and_belongs_to_many :products
has_many :created_products, :class_name => "Product", :foreign_key => :product_id
default_scope :order => "username ASC"
# Attributs pour le login (Livre)
validates :username, :presence => true, :uniqueness => true
validates :password, :confirmation => true
attr_accessor :password_confirmation
attr_reader :password
validate :password_must_be_present
def User.authenticate(name, password)
logger.debug "---------- Beginning of Authenticate"
if user = User.where(:username => name)
logger.debug "utilisateur = #{user.inspect}" # THIS IS OK AND NOT NIL
logger.debug "utilisateur hashed PW = #{user.hashed_password}" # ERROR
if user.hashed_password == encrypt_password(password, user.salt)
return user
end
end
end
def User.encrypt_password(password, salt)
Digest::SHA2.hexdigest(password + "wibble" + salt)
end
def password=(password)
@password = password
if (password.present?)
generate_salt
self.hashed_password = self.class.encrypt_password(password, salt)
end
end
private
def password_must_be_present
errors.add(:password, "Mot de passe manquant") unless hashed_password.present?
end
def generate_salt
self.salt = self.object_id.to_s + rand.to_s
end
end