【发布时间】:2011-07-04 11:36:37
【问题描述】:
我正在关注敏捷 Web 开发的第 13 次迭代,用于用户登录。
我创建了一个迁移来向我的用户模型添加 2 列:hashed_password 和 salt。
- 用户创作作品
- 登录失败,由于此错误未定义方法 'hashed_password' in method 'authenticate'
问题是:
- 在 Rails 控制台中,我可以获取 User.first.hashed_password,看起来没问题 :-)
- 我输出了我喜欢的用户,它不是零
- 我尝试像在 rails 控制台中那样输出 user.hashed_password,但总是抛出相同的错误:
NoMethodError (未定义方法hashed_password' for #<ActiveRecord::Relation:0x00000003e6c3c0>):
app/models/user.rb:21:inauthenticate'
app/controllers/sessions_controller.rb:6:in `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
【问题讨论】:
标签: ruby-on-rails login agile