这是不是某种同步的问题我以前readed。 该代码非常简单。 该模型:

class User < ActiveRecord::Base
    attr_accessor :name, :email
    validates_uniqueness_of :email, :on => :create, :message => "must be unique"
 end

在rspec的测试:

require 'spec_helper'
describe User do
    before(:each) do
       @valid_attributes = {
           :name => "Foo Bar",
           :email => "foo@bar.com"
        }
     end  
    it "should reject duplcate email address" do
        User.create!(@valid_attributes)
        duplicate_user = User.new(@valid_attributes)
        duplicate_user.should_not be_valid
     end
  end

我运行测试,并得到误差信息:

----------------------------
1)
'User should reject duplcate email address' FAILED
expected #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil> not to be valid
/Users/mac/workspace/rails_space/uniq/spec/models/user_spec.rb:14:

Finished in 0.067908 seconds

1 example, 1 failure
-----------------------------

我运行脚本/控制台,并创建具有相同的电子邮件地址的两个用户对象。它会很好,不验证消息出现,这两个对象都已经插入到表中。我不知道什么地方错了。

我的Rails版本是2.3.8和RSPC是1.3.0。

有帮助吗?

解决方案

我相信问题是attr_accessor行,你有。如果你有这些列名,则访问将覆盖列名,这就是类的只是一部分,不关心的唯一性。如果你想有存取方法则需要得到某种方式回到数据库。如果您需要有访问,那么你就需要通过调用write_attribute将它与数据库中。

有关详细信息,您可以在 HTTP看到“改写默认访问器”的文档: //api.rubyonrails.org/classes/ActiveRecord/Base.html

我希望这有助于!

其他提示

我认为这个问题是因为你说:

validates_uniqueness_of :email, :on => :create

User.new可以不触发此验证。 尝试调用的 duplicate_user.save!的,看看有没有抛出一个错误。

您可以尝试像以下

attr_accessible :email
validates_uniqueness_of :email, :on => :create, :message => "must be unique"
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top