6

Rails 4では、ユーザー モデルでhas_secure_passwordを使用しています。トリックによると、:password_confirmation を設定しないとトリガーされませんが、テストを実行するとエラーが発生します。パスワードの確認は、次のように空白にすることはできません。

Failures:

1) User 
 Failure/Error: it { should be_valid }
   expected #<User id: nil, name: "joe", email: "joe@mail.com", created_at: nil, 
   updated_at: nil, password_digest: "$2a$04$mcRr/msgYQR3kBVc3kv/m.UotBJuJuSXZKMw
   /eHTvU87..."> to be valid, but got errors: Password confirmation can't be blank

私のテストファイルは次のようになります:

require 'spec_helper'

describe User do

   before { @user = User.new(name: 'joe', email: 'joe@mail.com', password: 'foo') }

   subject { @user }
   #....
   #....
   describe "when password is not present" do
     before { @user.password = "" }
     it { should_not be_valid }
   end
end

なぜこのエラーが発生するのですか?解決策はありますか? ありがとう

4

3 に答える 3

21

簡単に言えば

has_secure_password validations: false # This is the key to the solution
validates :password, presence: true, length: { minimum: 6 } # Or an length you want

長い物語

  1. ドキュメントソースコードには次のように書かれています:

    確認の検証が必要ない場合は、password_confirmation 属性に値を設定しないでください。検証はトリガーされません。

  2. しかし、彼らは次のようにも言います。

    作成時のパスワードの存在の検証、パスワードの確認 (+password_confirmation+ 属性を使用) が自動的に追加されます。検証をオフにしたい場合は、引数として validations: false を渡します。必要に応じて、手動で検証を追加できます。

  3. 項目 1 は完全な説明ではありません。ポイント 2 で説明したように、すべての検証をオフにし、独自の検証ルールを追加して、これを機能させる必要があります。

私はこれに時間を費やし、教訓を得ました。混乱したときはソースコードを見つけてください。これは、苦しい道や大変な道のように思えますが、正しい道の場合もあります。

于 2013-09-18T03:14:55.390 に答える
5

テストのbefore行を次のように変更します。

before { @user = User.new(
  name: 'joe',
  email: 'joe@mail.com',
  password: 'foo',
  password_confirmation: 'foo')  #<== this line!
}

それはそれを修正する必要があります。

内容:

ほとんどすべての Web サイトで新しいアカウントを作成するときに、パスワードを作成して 2 回入力するよう求められることをご存知ですか? それがこれです。新しいユーザーを作成するときhas_secure_password、タイプミスをしていないことを確認するためにパスワードを 2 回入力する必要があります。

password!=の場合password_confirmation、例外がスローされ、ユーザーは作成されません。

繰り返しますが、これはユーザーの作成時にのみ使用されます。ログインフォームなどに 2 つのパスワードを入力する必要はありません。 このフィールドをモデルまたは DB に追加する必要はありません。

ユーザー作成フォームがあり、password_confirmationフィールドが必要ない場合は、その必要はありません。password_confirmation = passwordsave などを呼び出す前に、コントローラーで設定できます。

ただし、 User creationの場合、 が存在するpassword_confirmation 必要があります。

于 2013-07-31T00:41:22.493 に答える