这不是我之前提到过的某种同步问题。 代码很简单。 模特:
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。
答案 0 :(得分:1)
我认为这个问题是因为你说:
validates_uniqueness_of :email, :on => :create
User.new可能无法触发此验证。 尝试调用 duplicate_user.save!,看看是否会引发错误。
答案 1 :(得分:1)
我认为问题在于您拥有的attr_accessor
行。如果您有这些列名,则访问者将覆盖列名,这只是类的一部分,并不关心唯一性。如果您要使用访问器方法,则需要以某种方式返回数据库。如果您需要访问者,则需要通过调用write_attribute
将其绑定到数据库。
有关详细信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Base.html
上的“覆盖默认访问者”文档我希望这有帮助!
答案 2 :(得分:0)
您可以尝试以下
attr_accessible :email
validates_uniqueness_of :email, :on => :create, :message => "must be unique"