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

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

私のレールのバージョンは 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 に答える