33

在我的开发和测试环境中,我想在数据库中植入一堆用户。我正在使用 Ruby on Rails v3.2.8 和最新的设计。所以我在我的 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

如果您使用的是设计confirmable模块,则需要执行以下操作:

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

播种用户表:

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

安装设计后,将:password自动散列并保存到:encrypted_password

于 2016-02-05T02:47:06.477 回答
4

我不知道它是否有帮助,但实际上我这样做是为了在我的Rails 5应用程序中创建一个默认管理员用户,但没有在我的 GitHub 存储库中以纯文本形式共享密码。

基本上,这样做的逻辑是:

  • 播种时为默认用户生成一个安全的随机密码。
  • 转到“.../admins/sign_in”并单击“忘记密码?” 链接重置它。
  • 在该默认电子邮件帐户中获取重置密码链接。
  • 设置新密码。

所以在db/seeds.rb附录中:

randomPassword = Devise.friendly_token.first(8)
mainAdminUser = Admin.create!(email: "me@gmail.com", password: randomPassword, name: "Username")

如果您使用的是设计confirmable功能,只需执行以下操作即可跳过可确认的选项:

mainAdminUser = Admin.new(
    email: "me@gmail.com",
    password: randomPassword,
    password_confirmation: randomPassword,
    name: "Username"
)
mainAdminUser.skip_confirmation!
mainAdminUser.save!

你的好去处!

现在您有一个默认用户,但您没有共享默认密码!我希望它对某人有用。

于 2017-02-04T23:20:48.430 回答
1

使用您的 db/seeds.rb 文件来启动您的第一个用户:

User.create!(email: 'palo@alto.com', 
             password: '123456789', 
             password_confirmation: '123456789')
于 2014-08-14T16:35:43.040 回答
1

对于 seed.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

更新其他人已经发布,这是更好的方法:

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

我在我的一个要求中做了同样的事情,所以只需粘贴我的片段

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 回答
0

在 db:seed 中确认电子邮件:

User.create!( name: 'John', email:'john@hotmail.com', password: '123456', password_confirmation: '123456',confirmed_at: '2018-08-04 04:51:43', current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1")
于 2018-08-04T04:57:29.977 回答
0

只需添加 :password 属性 rest,devise 会为你做 password_encrypt

user = User.new({ email: 'test@example.com', password: 'EnterYourPassword'})
user.save!
flash[:notice] = 'User Created'

#or for extra logic

        #if user.save
          #ExtraCredentialsOrLogic

        #elsif user.errors.any?
          #user.errors.full_messages.each do |msg|
            #puts msg
          #end
        #else
          #puts "****NOT VALID****"
    #end

现在运行'rake db:seed'

于 2018-12-26T13:01:03.767 回答
0

这使您可以多次运行种子而不会出错:

User.where(email: "you@email.com").first_or_create.update_attributes(nome: "Your Name",
    email: "you@email.com",
    password:              "password#123",
    password_confirmation: "password#123")
于 2019-01-26T22:08:56.530 回答
0

不要尝试创建加密密码,请为您设计处理。这将起作用,只需确保密码长度至少为 6 个字符。

User.create(
        email: "test@test.com",
        password: "123456"
    )

更好的是,在您的终端中:

$bundle add faker

然后:

User.create(
            email: test@test.com,
            password: "123456"
        )
10.times do
  User.create(
              email: Faker::Internet.email,
              password: "123456"
           )
end

只要确保您在种子中设置了至少一封您能记住的电子邮件。因此保留“测试”电子邮件。

于 2020-05-01T09:08:01.637 回答