我正在使用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 包装带有错误的字段,要么删除“密码摘要不能为空”。一共错误。
感谢。
答案 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