33

私の開発およびテスト環境では、データベースに多数のユーザーをシードしたいと考えています。Ruby on Rails v3.2.8 と最新の Devise を使用しています。そこで、db/seeds.rb ファイルに次の行を追加しました。

User.create(email: 'test@example.com', encrypted_password: '#$taawktljasktlw4aaglj')

ただし、 を実行するrake db:setupと、次のエラーが発生します。

レーキが中止されました! 保護された属性を一括割り当てできません: encrypted_pa​​ssword

ユーザーをシードする適切な方法は何ですか?

4

14 に答える 14

49

次のようにする必要があります。

user = User.new
user.email = 'test@example.com'
user.encrypted_password = '#$taawktljasktlw4aaglj'
user.save!

このガイドを読んで、大量割り当てとは何かを理解してください: http://guides.rubyonrails.org/security.html

暗号化されたパスワードを直接設定する必要があるのはなぜだろうと思っています。あなたはこれを行うことができます:

user.password = 'valid_password'
user.password_confirmation = 'valid_password'
于 2012-09-14T05:29:14.543 に答える
29

アルン そうです。あなたのseeds.rbでこれを行う方が簡単です

user = User.create! :name => 'John Doe', :email => 'john@gmail.com', :password => 'topsecret', :password_confirmation => 'topsecret'
于 2012-09-14T07:13:20.440 に答える
15

このskip_confirmationメソッドは、ユーザー モデルにモジュールがある場合にのみ機能confirmableし、それ以外の場合は削除します。

  user = User.new(
      :email                 => "admin@xxxxx.xxx",
      :password              => "123456",
      :password_confirmation => "123456"
  )
  user.skip_confirmation!
  user.save!
于 2012-09-14T07:21:53.160 に答える
8

これは古い質問ですが、管理者ユーザー (cancancan から) の例を次に示します。

User.create!([
  {email: "testadmin@mvmanor.co.uk", password: "testadminuser", password_confirmation: "testadminuser", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:02:10", last_sign_in_at: "2015-02-06 14:02:10", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: true},
  {email: "testuser@mvmanor.co.uk", password: "testuseraccount", password_confirmation: "testuseraccount", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:03:01", last_sign_in_at: "2015-02-06 14:03:01", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: false},
  {email: "testcustomer@customer.co.uk", password: "testcustomeruser", password_confirmation: "testcustomeruser", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:03:44", last_sign_in_at: "2015-02-06 14:03:44", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: false}
])
于 2015-02-06T14:17:20.440 に答える
7

deviseconfirmableモジュールを使用している場合は、次のようにする必要があります。

user = User.new(
  email: 'user@domain.com', 
  password: '123456789', 
  password_confirmation: '123456789'
)
user.skip_confirmation!
user.save!

呼び出しは、skip_confirmation!このアカウントを確認する必要がないことを工夫するだけです。
他のオプションは、保存する前にconfirmed_atユーザー属性を設定するだけです。Time.now.utc

于 2016-04-15T12:35:07.090 に答える
4

users テーブルをシードするには:

User.create(
        email: "example@gmail.com",
        password: "12345678"
    )

デバイスがインストールされている:passwordと、自動的にハッシュされて保存されます:encrypted_password

于 2016-02-05T02:47:06.477 に答える
1

Seeds.rb ファイルのデバイス ユーザーの場合、新しいユーザーを保存するときに一般的なパスワードを使用するのが効果的でした。次に、暗号化されたパスワードを更新し、モデルを再度保存します。これはハックな方法でした。

user = User.new(
    :email                 => "admin@xxxxx.xxx",
    :password              => "fat12345",
    :password_confirmation => "fat12345"
)
user.save!
user.encrypted_password="ENCRYPT.MY.ASS!!!KJASOPJ090923ULXCIULSH.IXJ!S920"
user.save

UPDATE 他の人が投稿しましたが、これはそれを行うためのより良い方法です:

user = User.new(
    email: "foo@bar.com", 
    password: "foob1234", 
    password_confirmation: "foob1234"
)
user.skip_confirmation! #only if using confirmable in devise settings in user model.
user.save!
于 2015-11-08T19:20:20.793 に答える
0

要件の1つで同じことをしたので、スニペットを貼り付けるだけです

def triggerSeedUsers
      p "Starting Seeding Users..."
      p   "Deleting all users"..
      User.destroy_all
      normal_users = [{:email => 'abc@domain.com', :login => "abc_demo", :name => 'abc Demo'}]
      admin_users = [{:email => 'admin@domain.com', :login => 'abc_admin', :name => 'abc Admin'}]

      [normal_users,admin_users].each do |user_type|
        user_type.each do |user|
          User.create!(:name => user[:name],
            :login => user[:login],
            :email => user[:email],
            :first_login => false,
            :password => 'P@ssw0rd',
            :password_confirmation => 'P@ssw0rd'
            )
        end
      end
      User.where('name LIKE ?', '%demo%').update_all(:is_admin => 0)
      User.where('name LIKE ?', '%admin%').update_all(:is_admin => 1)
     end
于 2012-09-14T07:20:09.417 に答える