Ruby on Rails has_secure_password验证在更新时出错

时间:2017-06-07 22:05:12

标签: ruby-on-rails validation

我正在研究Ruby on Rails应用程序并遇到问题。我在我的域中拥有用户模型,它有一个has_secure_password字段,如下所示:

class User < ApplicationRecord
    validates :name, presence: true

    has_secure_password
    validates :password, presence: true
    validates :password, length: { in: 6..20, message: 'Password shoul be minimum 6 characters'}
end

我用这个函数保存用户对象:

def self.create_with_params(email,name,password)
    user = User.new()
    user.provider= :mail
    user.name=name
    user.email=email
    user.password=password
    user.activate_status=false

    user.save(validate: true);

    return user;
end

那也没关系。

但是当我想更新用户模型中的字段时。我收到了password字段的验证错误。

@user = User.find_by(email: params[:email]) # this record has a valid password_digest field in database.
@user.name = 'John'
@user.save

puts @user.errors.full_messages

打印:

  

&#34;密码最少6个字符&#34;。

注意:我的用户表中有password_digest字段。

我认为当我查询users表格password_digest字段时,无法填写模型上的password字段。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

我认为当我查询用户表时,password_digest字段不可能   填写模型上的密码字段。

正确,密码未存储,因此当您查询User时,您没有获得password字段,但您的模型每次都会询问:

validates :password, presence: true

因此,您需要在保存password之前提供@user才能使其正常工作,但我想这不是您想要的,所以只需从您的模型中删除该验证,

每次创建时,您都不需要验证password,并且使用has_secure_password进行验证。

另外,出于同样的原因,您需要将length验证更新为:

validates :password, length: { in: 6..20, message: 'Password shoul be minimum 6 characters'}, allow_nil: true