我正在关注Agile Web开发的迭代13,用户登录。
我创建了一个迁移,为我的用户模型添加了2列:hashed_password和salt。
问题在于:
NoMethodError(未定义方法hashed_password' for #<ActiveRecord::Relation:0x00000003e6c3c0>):
app/models/user.rb:21:in
authenticate'
app / controllers / sessions_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
答案 0 :(得分:0)
User.where(:username =&gt; name)返回一个ActiveRecord :: Relation对象(因此您看到的错误消息)。尝试将if语句更改为:
if user = User.where(:username => name).first
这将设置第一个匹配用户,该用户将是User的实例,因此将具有hashed_password字段。如果没有用户匹配,你将获得零。
答案 1 :(得分:0)
把它放在你的模型中
private
def self.hash_password(password)
Digest::SHA1.hexdigest(password)
end