Rails 3.1.1 has_secure_password摘要不能为空

时间:2011-10-23 17:15:10

标签: ruby-on-rails-3

我一直在使用has_secure_password,但遇到了问题。我在UsersController中对create动作的测试不是 working 传递。所以我开始在控制台中玩游戏并意识到密码没有转换为has并保存在password_digest字段中。

当我尝试从控制台创建用户时,会发生以下情况。

irb(main):031:0> u = User.new(:email => "test1@test.com", :password => "test", :password_confirmation => "test")
=> #<User id: nil, email: "test1@test.com", password_digest: nil, created_at: nil, updated_at: nil>
irb(main):032:0> u.save
=> false
irb(main):033:0> u.errors
=> #<ActiveModel::Errors:0x00000100cde500 @base=#<User id: nil, email: "test1@test.com", password_digest: nil, created_at: nil, updated_at: nil>, @messages={:password_digest=>["can't be blank"]}>

我不确定我做错了什么。看起来似乎永远不会分配password_digest属性。如果我创建一个没有属性的用户对象并单独分配每个属性,我会得到相同的错误。

这是我的模特

class User < ActiveRecord::Base
  has_secure_password
  attr_accessible :email, :password, :password_confirmation
end

感谢您的帮助。

Alex Shenoy

3 个答案:

答案 0 :(得分:10)

我有相同的症状,即password_digest不能为空的消息。我遇到的问题是我在user.rb中设置了这个:

  attr_accessor :password

这阻止了调用方法password =(参见secure_password.rb)

  # Encrypts the password into the password_digest attribute.
  def password=(unencrypted_password)
    @password = unencrypted_password
    unless unencrypted_password.blank?
      self.password_digest = BCrypt::Password.create(unencrypted_password)
    end
  end

因此从未为password_digest设置该值。

对我来说,解决方法是删除attr_accessor行。

答案 1 :(得分:2)

我有一个非常类似的问题。我会保存用户,但password_digest始终为nil。对我来说,这是因为我的模型中有以下代码顺序:

attr_accessible :name, :password, :password_confirmation
has_secure_password

我把它改为:

has_secure_password
attr_accessible :name, :password, :password_confirmation

现在它完美无缺。

答案 2 :(得分:0)

我做了一个简单的例子并按预期工作。也许你的配置中有一些东西弄乱了这个。我的简单测试:

$ rails new test
$ cd test
$ rails g model user name:string password_digest:string
$ rake db:migrate
$ vim app/model/user.rb

添加

has_secure_password
attr_accessible :name, :password, :password_confirmation

保存并退出

$ rails c

Loading development environment (Rails 3.1.1)
ruby-1.9.2-p290 :001 > u = User.new(:name => "test1@test.com", :password => "test", :password_confirmation => "test")
=> #<User id: nil, name: "test1@test.com", password_digest: "$2a$10$08xY7p.8hq1.95ZQsx63ku05YfvVqSQ/CLiqUW5dtGhZ...", created_at: nil, updated_at: nil>
ruby-1.9.2-p290 :002 > u.save
Binary data inserted for `string` type on column `password_digest`
  SQL (51.4ms)  INSERT INTO "users" ("created_at", "name", "password_digest", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Sun, 23 Oct 2011 13:38:49 UTC +00:00], ["name", "test1@test.com"], ["password_digest", "$2a$10$08xY7p.8hq1.95ZQsx63ku05YfvVqSQ/CLiqUW5dtGhZSP9S7FtUy"], ["updated_at", Sun, 23 Oct 2011 13:38:49 UTC +00:00]]
=> true