使用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: true
和case_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”。我相信这些都是完全相同的。
答案 0 :(得分:1)
我不知道您的具体数据库设置,但是,我想说这很可能就是问题。
这是来自Rails API指南的引用:uniqueness:
请注意,某些数据库配置为执行不区分大小写的搜索。
http://edgeguides.rubyonrails.org/active_record_validations.html#uniqueness
据我所知,目前还没有官方补丁。我能找到的最好的是这些陈旧的讨论:
两者都提到了不同的方法。
我认为你最好的选择是反对你的生产环境。似乎它在不同的平台上表现不同。
答案 1 :(得分:0)
您的VALID_EMAIL_REGEX存在问题,您必须以/ i结尾,以区分大小写。