在Ruby on Rails中使用Devise为用户提供服务

at.*_*at. 26 ruby-on-rails seed devise ruby-on-rails-3 ruby-on-rails-3.2

在我的开发和测试环境中,我想用一堆用户为数据库播种.我正在使用Ruby on Rails v3.2.8和最新的Devise.所以我在db/seeds.rb文件中添加了这一行:

User.create(email: 'test@example.com', encrypted_password: '#$taawktljasktlw4aaglj')
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时rake db:setup,我收到以下错误:

耙子流产了!无法批量分配受保护的属性:encrypted_pa​​ssword

种子用户的正确方法是什么?

Aru*_*nan 40

你必须这样做:

user = User.new
user.email = 'test@example.com'
user.encrypted_password = '#$taawktljasktlw4aaglj'
user.save!
Run Code Online (Sandbox Code Playgroud)

阅读本指南以了解批量分配的内容:http://guides.rubyonrails.org/security.html

我想知道为什么必须直接设置加密密码.你可以这样做:

user.password = 'valid_password'
user.password_confirmation = 'valid_password'
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在为一群真实用户播种,并且您有他们也在播种的电子邮件地址,那么您是否也会像这样播种密码并让他们在登录后更改?或者你会怎么做? (3认同)

小智 26

阿伦是对的.在seed.rb中执行此操作更容易

user = User.create! :name => 'John Doe', :email => 'john@gmail.com', :password => 'topsecret', :password_confirmation => 'topsecret'
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在为一群真实用户播种,并且您有他们的电子邮件地址,您是否也会使用该密码并让他们更改一次并且如果他们登录? (3认同)

Muh*_*lid 14

跳过确认方法仅在您的用户模型中具有适合的模块时才有效,否则将其删除

  user = User.new(
      :email                 => "admin@xxxxx.xxx",
      :password              => "123456",
      :password_confirmation => "123456"
  )
  user.skip_confirmation!
  user.save!
Run Code Online (Sandbox Code Playgroud)


Kox*_*xzi 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}
])
Run Code Online (Sandbox Code Playgroud)


Vic*_*tor 6

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

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

skip_confirmation!电话只是告诉你设计你不需要确认这个帐户.
其他选项只是将confirmed_at用户属性设置为Time.now.utc保存之前.