在我的user.rb
模型中,我有一个email_confirm
字段,以便用户插入两次并验证没有拼写错误的电子邮件
attr_accessor :email_confirmation
validates :email, confirmation: true, on: :create
validates :email_confirmation, presence: true, allow_nil: true
但是,如果我插入带有大写字母的电子邮件,我会收到验证错误"don't match"
。如何确认不区分大小写的电子邮件?
我正在使用设计
答案 0 :(得分:1)
对于电子邮件验证,请使用正则表达式匹配器:
validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
正则表达式末尾的i
标志设置不区分大小写。此验证还处理存在,因为nil或空字符串将无法通过上述验证。
我建议使用Rubular来测试正则表达式:http://rubular.com/
修改强>
您可以在before_validation
块中预处理该属性:
before_validation :downcase_email
def downcase_email
email_confirmation.try(:downcase!)
email.try(:downcase!)
end
try
是为了防止在电子邮件为零时调用downcase!
。
答案 1 :(得分:1)
我会使用自定义验证器:
class User < ActiveRecord::Base
attr_accessor :email_confirmation
validates :email, presence: true
validate :check_email_confirmation, if: :email_changed?
private
def check_email_confirmation
if email.casecmp(email_confirmation.to_s).nonzero?
errors.add(:email, "Emails don't match")
end
end
end
casecmp
是一种不区分大小写的字符串比较方法。对于完全重音的UTF-8字符比较,它无法正常工作,但您不需要在电子邮件中使用它。
使用此方法,您无需在验证之前以任何方式更改输入属性。此外,我更新了验证,以便email
是必需属性,并且仅在电子邮件更改时才进行确认检查。