2010-08-11 58 views
0

这不是我之前收集的某种同步问题。代码很简单。 模型:validates_uniqueness_of不起作用

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 => "[email protected]" 
     } 
    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。

回答

1

我相信问题是你有的attr_accessor行。如果您有这些列名称,访问者将覆盖列名称,这只是该类的一部分,并不关心唯一性。如果你打算使用accessor方法,那么它需要以某种方式回到数据库。如果您需要访问者,那么您需要通过调用write_attribute将其绑定到数据库。

欲了解更多信息,您可以在http://api.rubyonrails.org/classes/ActiveRecord/Base.html

看到“改写默认访问器”的文档,我希望这会有所帮助!

+0

是的,问题出在那里!非常感谢你的帮助! – wupher 2010-08-11 06:42:12

1

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

validates_uniqueness_of :email, :on => :create 

User.new无法触发此验证。 尝试拨打duplicate_user.save!,看看是否会抛出错误。

+0

没有,没有错误抛出。 – wupher 2010-08-11 03:23:05

+0

我运行控制台,它仍然可以保存两个重复的电子邮件对象。快照是这里:http://cl.ly/a92100cd98829580d876 我不知道所有这一切的错误。 – wupher 2010-08-11 03:31:43

0

你可以尝试像下面

attr_accessible :email 
validates_uniqueness_of :email, :on => :create, :message => "must be unique"