2012-05-04 467 views
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是未定義的。我如何解決這個問題?

邁克

回答

5

attr_accessible只是告訴Rails特性允許在大規模作業進行設置,它實際上並沒有創造的屬性,如果它們不存在。

您需要使用attr_accessorpasswordpassword_confirmation,因爲這些屬性沒有相應的字段在數據庫:

class User < ActiveRecord::Base 
    attr_accessor :password, :password_confirmation 
    attr_accessible :email, :name, :password, :password_confirmation 
    ... 
end 
+0

軌球員需要做的東西給attr_accessible不同的名稱。 ..我見過這麼多人混淆attr_accessor和attr_accessible – Abid

+0

好吧,我發現這個問題。我錯過了User類中的has_secure_password行。我不知道爲什麼或如何運作。有人可以請賜我嗎? – mikeglaz

+0

你可以在這裏看到['has_secure_password']的源代碼和文檔(https://github.com/rails/rails/blob/master/activemodel/lib/active_model/secure_password.rb)。這是一個基本功能,它在模型中混合了一些額外的功能(一個'attr_reader:password'和一個在密碼屬性更改時自動生成加密密碼/ password_digest的setter)。 – pjumble