0

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

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。

4

3 回答 3

1

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

validates_uniqueness_of :email, :on => :create

User.new 可能不会触发此验证。尝试调用duplicate_user.save!看看是否会引发错误。

于 2010-08-11T02:55:41.300 回答
1

我相信问题出在attr_accessor你的线路上。如果您有这些列名,则访问器将覆盖列名,这只是类的一部分,并不关心唯一性。如果您要使用访问器方法,那么它需要以某种方式返回数据库。如果您需要访问器,则需要通过调用将其绑定到数据库write_attribute

有关更多信息,您可以在http://api.rubyonrails.org/classes/ActiveRecord/Base.html中查看“覆盖默认访问器”的文档

我希望这有帮助!

于 2010-08-11T04:36:09.257 回答
0

您可以尝试如下

attr_accessible :email
validates_uniqueness_of :email, :on => :create, :message => "must be unique"
于 2010-08-11T06:20:30.217 回答