web-dev-qa-db-ja.com

Rails(4.1.5))でyml.erbとしてフィクスチャ(Deviseユーザー用)を作成する方法は?

更新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では機能しません)。

25
Anand

パスワードもプレーンテキストで渡す必要があります。フィクスチャユーザーを作成できないユーザーモデル検証エラーがあると思います。これが機能する私のユーザーフィクスチャの例です:

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で実行します。

31
kroky
<% 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 %>
9
Jian Weihang