Rails 4在没有case_sensitive的情况下验证电子邮件唯一性

时间:2014-01-10 22:33:14

标签: mysql ruby-on-rails macos validation ruby-on-rails-4

使用Ruby 2.1.0,Rails 4.0.2,MySQL和OS X,我无法使验证器uniqueness: { case_insensitive: XXX }正常工作。

是的,我意识到这几乎或正好与Rails 3. Validating email uniqueness and case sensitive fails相同。但那里的答案流下来了“不要那样做”的分叉,至少出于教学原因,我想真正回答这个问题。出于对在那里采取的路线的尊重,我开始了一个新的问题。对不起,如果那是辱骂。

我的难点在于 case_sensitive: truecase_sensitive: false会产生相同的结果,即使(AFAICT)他们不应该这样做。

models / user.rb extract:

class User < ActiveRecord::Base
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@akamai\.com\z/i
  validates :email, presence: true, uniqueness: { case_sensitive: false }, format: {
        with: VALID_EMAIL_REGEX,
        message: "Must be an Akamai email address."
  }
end

spec / models / user_spec.rb 提取:

require 'spec_helper'
describe User do
  before { @user = User.new(email: "giuseppe@akamai.com") }
  subject { @user }
  it { should be_valid }
  context "email" do
    describe "is already taken (caserifically)" do
      before do
        user_with_same_email = @user.dup
        user_with_same_email.email = @user.email.upcase
        user_with_same_email.save
      end
      it { should_not be_valid }
    end
  end
end

如上所述,测试通过(user_with_same_email无效)。凉。

但是,如果我将验证的false更改为true,则测试仍会通过(user_with_same_email仍然无效,可能会发生冲突)。酷。

我知道MySQL / OSX在表名方面不区分大小写(由于不区分大小写的底层文件系统),但这不会扩展到值比较,是吗?

噢,刚注意到(未答复的)Ruby on Rails Tutorial - Michael Hartl - Test “User when email address is already taken”。我相信这些都是完全相同的。

2 个答案:

答案 0 :(得分:1)

我不知道您的具体数据库设置,但是,我想说这很可能就是问题。

这是来自Rails API指南的引用:uniqueness:

  

请注意,某些数据库配置为执行不区分大小写的搜索。

http://edgeguides.rubyonrails.org/active_record_validations.html#uniqueness

据我所知,目前还没有官方补丁。我能找到的最好的是这些陈旧的讨论:

两者都提到了不同的方法。

我认为你最好的选择是反对你的生产环境。似乎它在不同的平台上表现不同。

答案 1 :(得分:0)

您的VALID_EMAIL_REGEX存在问题,您必须以/ i结尾,以区分大小写。

相关问题