2010-08-11 35 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"