Rails验证确认true不区分大小写?

时间:2016-04-25 18:08:05

标签: ruby-on-rails activerecord

在我的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"。如何确认不区分大小写的电子邮件?

我正在使用设计

2 个答案:

答案 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是必需属性,并且仅在电子邮件更改时才进行确认检查。