更新3:これは.yml.erbのフィクスチャに固有のようです-テンプレート化されたコードがない場合でも、 yml.erbファイルが読み込まれません。プレーンな.ymlファイルがあれば機能します。これはおそらくdevise自体とは関係ありません。
注:関連する変更については、Update 3の注釈を参照してください
RailsアプリでDeviseユーザーを生成する必要があります。データベースをクリアしてフィクスチャをロードすると、Deviseユーザー以外のすべてのフィクスチャがロードされます(Update 3:.yml.erbファイルにあります)。
私は this other thread を見てきましたが、そこですべてのオプションを試しましたが、フィクスチャをロードしていないようです。
# ../fixtures/users.yml.erb
user1:
email: [email protected]
name: user1
encrypted_password: <%= Devise.bcrypt(User, 'passw0rd!') %>
# also tried encrypted_password: User.new(password_salt: '$2a$10$PoBe1MvkoGJsjMVTEjKqge').send(:password_digest, 'somepassword')
admin: true
そしてコンソールから:
テストデータベースをクリアするには:
$ bundle exec rake db:schema:load Rails_ENV=test
フィクスチャをテストデータベースに読み込むには:
$ bundle exec rake db:fixtures:load Rails_ENV=test
Railsコンソールをテストで実行します(ユーザーは見つかりませんでしたが、Appなどの他のモデルフィクスチャがロードされています):
$ Rails c test
Loading test environment (Rails 4.1.5)
irb(main):001:0> User.first
User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
=> nil
irb(main):002:0> App.first
App Load (0.1ms) SELECT "apps".* FROM "apps" ORDER BY "apps"."id" ASC LIMIT 1
=> #<App id: 953336129,...>
更新1:コンソールから生成された暗号化されたパスワードを渡そうとしましたが、それでもユーザーレコードは見つかりません:
admin:
email: [email protected]
name: user1
encrypted_password: $2a$04$DR0.2yfWwD8AZlyeXx0gEuk2Qh.cNLF4cir0ZUB1iW7hwQhK/IfcC
admin: true
Update 2:フィクスチャファイルの名前をusers.ymlに変更すると機能します。 users.yml.erbへの名前変更が原因のようです。ところで、コンソールとrake test
から同じ動作が見られます(つまり、.ymlでは機能しますが、yml.erbでは機能しません)。
パスワードもプレーンテキストで渡す必要があります。フィクスチャユーザーを作成できないユーザーモデル検証エラーがあると思います。これが機能する私のユーザーフィクスチャの例です:
tom:
first_name: Tom
last_name: Test
email: [email protected]
password: 123greetings
encrypted_password: <%= User.new.send(:password_digest, '123greetings') %>
それでも失敗する場合は、log/test.log
ファイルでエラーを確認し、必要なフィールドやユーザーモデルで設定したその他の検証ルールがないかどうかを確認してください。
pdate:作者自身が問題を発見したことが判明-Railsフィクスチャファイルをバイパスする.ymlではなく.yml.erbファイル拡張子を使用。ERBはymlフィクスチャとしてRailsは、フィクスチャファイルを解析する前にERBで実行します。
<% 100.times do |n| %>
user_<%= n %>:
email: <%= "user#{n}@example.com" %>
encrypted_password: <%= Devise.bcrypt(User, 'password') %>
<% end %>
これは、同じことを行う別の方法です。インスタンスを新しく作成する必要はありません。
# lib/devise/models/database_authenticatable.rb:147
def password_digest(password)
Devise.bcrypt(self.class, password)
end
編集:
非推奨の使用法を指摘してくれた@ sixty4bitに感謝します。更新された回答は次のようになります。
<% 100.times do |n| %>
user_<%= n %>:
email: <%= "user#{n}@example.com" %>
encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
<% end %>