質問

以前に読んだような同期の問題ではありません。コードは非常に簡単です。モデル:

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
-----------------------------

スクリプト/コンソールを実行し、同じメールアドレスを持つ2つのユーザーオブジェクトを作成します。それはうまくいき、検証メッセージは発生しません、2つのオブジェクトが両方ともテーブルに挿入されています。何が悪いのかはわかりません。

私の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