2
我正在瀏覽邁克爾哈特爾的http://ruby.railstutorial.org/教程。Ruby on Rails 3教程
我在第六章專門的代碼清單6.27,看起來像這樣:
require 'spec_helper'
describe User do
before do
@user = User.new(name: "Example User", email: "[email protected]",
password: "foobar", password_confirmation: "foobar")
end
subject { @user }
it { should respond_to(:name) }
it { should respond_to(:email) }
it { should respond_to(:password_digest) }
it { should respond_to(:password) }
it { should respond_to(:password_confirmation) }
it { should be_valid }
end
現在,用戶對象是這樣的:
class User < ActiveRecord::Base
attr_accessible :email, :name, :password, :password_confirmation
before_save { |user| user.email = email.downcase }
validates :name, presence: true, length: {maximum: 50}
VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniquenes
{case_sensitive: false}
end
用戶對象有六個屬性:id,名稱,電子郵件,created_at,updated_at,password_digest。 password_digest是存儲哈希密碼的地方。但正如你所看到的,密碼和password_confirmation字段不在數據庫中。只有password_digest是。作者聲稱我們不需要將它們存儲在數據庫中,而只是在內存中暫時創建它們。但是當我運行從rspec測試代碼:
@user = User.new(name: "Example User", email: "[email protected]",
password: "foobar", password_confirmation: "foobar")
我得到一個錯誤告訴我字段密碼和password_confirmation是未定義的。我如何解決這個問題?
邁克
軌球員需要做的東西給attr_accessible不同的名稱。 ..我見過這麼多人混淆attr_accessor和attr_accessible – Abid
好吧,我發現這個問題。我錯過了User類中的has_secure_password行。我不知道爲什麼或如何運作。有人可以請賜我嗎? – mikeglaz
你可以在這裏看到['has_secure_password']的源代碼和文檔(https://github.com/rails/rails/blob/master/activemodel/lib/active_model/secure_password.rb)。這是一個基本功能,它在模型中混合了一些額外的功能(一個'attr_reader:password'和一個在密碼屬性更改時自動生成加密密碼/ password_digest的setter)。 – pjumble