我正在關注敏捷Web開發的迭代13,以供用戶登錄。未定義方法'hashed_password'使用rails的敏捷Web開發
我創建了一個遷移,將2列添加到我的用戶模型:hashed_password和salt。
- 用戶的創建工作
- 登錄失敗,因方法 '認證'
問題是這樣的錯誤未定義的方法 'hashed_password' 謂:
- 在軌控制檯,我可以獲取User.first.hashed_password,什麼似乎確定:-)
- 我輸出的用戶,我fecth,它不是無
- 我試圖輸出user.hashed_password如我在軌道控制檯做,但始終引發相同的錯誤:
NoMethodError(未定義的方法hashed_password' for #<ActiveRecord::Relation:0x00000003e6c3c0>): app/models/user.rb:21:in
的authenticate」 應用程序/控制器/ sessions_controller.rb:6:在'創造」
這是我的用戶模型:
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
事實上,這是它...爲什麼Rails的不採摘收集的只是第一個對象時,尺寸爲1? (也許對於導軌4 ;-)) –