如何将has_secure_password与field_with_errors一起使用

时间:2012-06-05 22:26:21

标签: ruby-on-rails ruby

我正在使用has_secure_password来验证我的用户密码及其确认。我遇到的问题是,当有任何错误时,字段不会被field_with_errors div包裹。我知道我可以添加

validates_presence_of :password, :on => :create
validates_presence_of :password_confirmation, :on => :create

但是会产生以下错误消息:

  

密码摘要不能为空。
  密码不能为空。
  密码确认不能为空

我想要么让has_secure_password用field_with_errors div 包装带有错误的字段,要么删除“密码摘要不能为空”。一共错误。

感谢。

3 个答案:

答案 0 :(得分:9)

具有此功能的SecurePassword模块非常简单,值得一看。好消息是,the master branch (Rails 4) {{3}}会解决您的问题validates_presence_of :password, :on => :create,但与此同时您可能希望自己模仿用户模型上的has_secure_password方法。

class User < ActiveRecord::Base
  attr_reader :password
  attr_accessible :password # ...
  validates_confirmation_of :password
  validates_presence_of :password, on: :create
  include ActiveModel::SecurePassword::InstanceMethodsOnActivation
end

还要确保在Gemfile中加载bcrypt

gem 'bcrypt-ruby', '~> 3.0.0', require: 'bcrypt'

希望有所帮助。

答案 1 :(得分:5)

正如@ryanb所述,validates_presence_of :password在master中是固定的,但不会向后移植。该修复程序还会清除Password digest can't be blank.消息。

因此,在模型中,您仍需要添加:

validates :password, presence: true, on: :create

正如@ henrique-zambon所说,没有必要添加validates_presence_of :password_confirmation。要突出显示密码确认字段,而不显示其他消息,请在显示错误后在该字段上添加错误。

然后,要隐藏额外的Password digest can't be blank.消息,您只需将其删除在表单顶部即可。

= form_for @user do |f|
  - if @user.errors.any?
    - @user.errors.delete(:password_digest)
    #error_explanation
      %h2= "#{pluralize(@user.errors.count, "error")} prohibited this user from being saved:"
      %ul
        - @user.errors.full_messages.each do |msg|
          %li= msg
    - @user.errors.add(:password_confirmation) if @user.errors.include?(:password)

答案 2 :(得分:2)

无需验证:password_confirmation的存在,has_secure_password会为您执行此操作。

您可能需要查看此RailsCast:Authentication in Rails 3.1