无法使用has_secure_password,password_digest错误

时间:2011-10-13 18:54:37

标签: ruby authentication ruby-on-rails-3.1

晚上好。我有个问题。我正在使用has_secure_password 造成这种情况我对#`,

有一个错误undefined method password_digest ='

但我没有这种方法!!请帮忙,不知道该怎么办。我读了如何解决这个问题,但它没有帮助我(

这是我的用户模型。如果可以,请帮忙。

class User < ActiveRecord::Base

  attr_accessible :email, :password, :password_confirmation
  has_secure_password

  validates_presence_of :password, :on => :create

  before_create { generate_token(:auth_token) }

  def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    save!
    UserMailer.password_reset(self).deliver
  end

  def generate_token(column)
    begin
      self[column] = SecureRandom.urlsafe_base64
    end while User.exists?(column => self[column])
  end
end

4 个答案:

答案 0 :(得分:26)

您可能忘记确保支持用户模型的迁移有一个password_digest列。确保列存在且它是一个字符串。如果没有,请创建迁移以添加列。

答案 1 :(得分:3)

我有同样的问题,我正在关注http://www.railstutorial.org/book/modeling_users 我的app/Controllers/users_controllers.rb没有创建属性的方法,我还使用git来共享便携式笔记本电脑和大型家庭之间的工作代码,这创建了迁移文件,但没有应用它,我的工作用户控制器如下。

class UsersController < ApplicationController
    def new
      attr_accessor :name, :email, :password
      def initialize(attributes = {})
      @name  = attributes[:name]
      @email = attributes[:email]
      @password = attributes[:password]
    end

    def formatted_email
      "#{@name} <#{@email}>"
    end
end

答案 2 :(得分:1)

嘿,我也在关注RoR并遇到同样的问题。这里的诀窍是bundle exec rake db:migrate失败,因此password_digest列尚未添加到数据库中。我的控制台抱怨用户的数据库已存在。我用“SQLite浏览器”删除db/development.sqlite3 manully。运行bundle exec rake db:migrate后,每次测试都通过

答案 3 :(得分:1)

has_secure_password密码存储在 password_digest 列而不是密码列中的模型。 实际上不需要密码列。

> u=User.create!(email: 'user@gmail.com', password: '12345678')
> u
#<User:0x007fc794be9278> {
                  :id => 1,
:email => "user@gmail.com",
     :password_digest => "$2a$10$S82GVFR..yO9jihgIoeMj.7dNMWtbCUZpWDKvH0tyMs1SYlfdefmW"
}