2

Railsチュートリアルを進めていくと、このエラーに悩まされました。

検証の一意性テストを実行しようとすると、上記のエラーが発生します。これらのエラーは、users フィクスチャを挿入した後に発生するようです。ユーザーにはパスワード属性がないと言っているように見えますが、私のユーザーモデルには attr_accessible 行で :password が定義されているため、何が間違っているのかわかりません。とにかく、以下の関連するコード行:

モデル/ユーザー:

attr_accessible :email, :password, :password_confirmation, :remember_me,
:first_name, :last_name, :profile_name
validates :profile_name, presence: true, uniqueness: true

フィクスチャ/users.yml:

name:
first_name: "user1"
last_name: "user2"
email: "email.com"
profile_name: "user"
password: "pass"
password_confirmation: "pass"

user_test.rb:

user.profile_name = users(:name).profile_name
4

4 に答える 4

3

has_secure_passwordパスワードのハッシュに使用される BCrypt に依存します。フィクスチャ内の BCrypt にアクセスできる必要があります。ERBも使えます。この手法を使用して、既知のパスワードのパスワード ハッシュを作成します。

homer:
  first_name: "Homer"
  ...
  password_digest: <%= BCrypt::Password.create('donuts', cost: 4) %>

フィクスチャで不明な値を手動で設定する代わりに、password_digestBCrypt を使用して、選択したパスワードのパスワード ダイジェストを作成します。

これで、テストで次のことができます。

test "homer logs in with correct password" do
  user = users(:homer)

  get '/login'
  assert_success :response

  post_via_redirect '/login', username: user.username, password: user.password

  assert_equal '/profile', path
  assert_not_nil session[:user_id]
  assert_equal user.id, session[:user_id]
end

は暗号化のcost速度に影響し、最速は 4 です。これは高速なテストに適しています。

passwordpassword_confirmationは によって追加された仮想属性has_secure_passwordであり、データベースにマップされていないため、エラーが発生します。password_digest列には、ソルト化され暗号化されたバージョンのパスワード (ダイジェストまたはハッシュと呼ばれます) が格納されます。フィクスチャは属性をデータベース列にマップするため、列にマップされていない属性を挿入すると、お気づきのように SQL エラーが発生します。

于 2015-01-21T13:32:20.803 に答える
2

teamtreehouse による Treebook の例に従っていると仮定します。データベースに password または password_confirmation という名前の列がないため、ビデオで提案されているフィクスチャは機能しません。これらは、devise が encrypted_pa​​ssword を作成するために使用するフィールドです。

フィクスチャを正しくするには、encrypted_pa​​ssword フィールドに次のように入力する必要があります。

name:
 first_name: "Boat"
 last_name: "Love"
 profile_name: "Supahlovar"
 email: "love.boat@boats.org"
 encrypted_password = "$2a$10$8uCZ9wCTsFoqa0aIfpssne4qtchcpqhepdU5WylZwh4GBAkgFWEYe"

暗号化されたパスワードには任意の値を使用できると思いますが、それは、データベースから取得したときに暗号化されたパスワードがどのように見えるかです。

于 2013-10-14T08:10:15.253 に答える
0

ユーザーにパスワード属性がないと言っているのではなく、データベースのユーザーテーブルにパスワード列がないと言っています(これは正しいですが、そうすべきではありません)。

コードの残りの部分を確認せずに (または、users テーブルの構造がわからない場合は、質問に追加してください)、has_secure_passwordモデルに行が欠けていると思います。

于 2013-03-04T05:26:54.163 に答える
-1

更新まで、私は言うつもりです:

  1. 移行を介してパスワード列をデータベースに追加します
  2. 次に実行しますrake db:migrate

(また、テストデータベースさえ持っていない場合は、rake db:test:prepare最初に実行する必要があります)

于 2013-03-04T05:31:14.730 に答える