2

Michael Hartl によるhttp://ruby.railstutorial.org/のチュートリアルを進めています。

私は第6章、具体的には次のようなコードリスト6.27にいます:

    require 'spec_helper'

    describe User do

      before do
        @user = User.new(name: "Example User", email: "user@example.com", 
                         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

User オブジェクトは次のようになります。

    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+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
      validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniquenes  
      {case_sensitive: false}
    end

User オブジェクトには、id、name、email、created_at、updated_at、password_digest の 6 つの属性があります。password_digest は、ハッシュされたパスワードが保存される場所です。しかし、ご覧のとおり、フィールド password と password_confirmation はデータベースにありません。password_digest のみです。著者は、それらをデータベースに保存する必要はなく、一時的にメモリに作成するだけであると主張しています。しかし、rspec テストからコードを実行すると:

    @user = User.new(name: "Example User", email: "user@example.com", 
                     password: "foobar", password_confirmation: "foobar")

フィールド password と password_confirmation が定義されていないというエラーが表示されます。どうすればこれを回避できますか?

マイク

4

1 に答える 1

5

attr_accessibleプロパティが一括割り当てで設定できることをRailsに伝えるだけで、プロパティが存在しない場合、実際にはプロパティを作成しません。

これらのプロパティにはデータベースに対応するフィールドがないため、attr_accessorforpasswordとを使用する必要があります。password_confirmation

class User < ActiveRecord::Base
  attr_accessor :password, :password_confirmation
  attr_accessible :email, :name, :password, :password_confirmation
  ...
end
于 2012-05-04T23:41:05.813 に答える