2010-08-11 19 views
0

Ce n'est pas une sorte de problème de synchronisation que j'ai lu auparavant. Le code est assez simple. Le modèle:validates_uniqueness_of ne fonctionne pas

class User < ActiveRecord::Base 
    attr_accessor :name, :email 
    validates_uniqueness_of :email, :on => :create, :message => "must be unique" 
end 

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

je lance le test et obtenir un message d'erreur:

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

je lance le script/console, et créer deux utilisateurs objets avec la même adresse email. Cela se passe bien, aucun message de validation ne se produit, les deux objets ont tous deux été insérés dans la table. Je ne sais pas ce qui ne va pas.

Ma version de rails est 2.3.8 et rspc est 1.3.0.

Répondre

1

Je crois que le problème est la ligne attr_accessor que vous avez. Si vous avez ces noms de colonnes, l'accesseur remplacera le nom de la colonne et cela fait juste partie de la classe et ne se soucie pas de l'unicité. Si vous devez avoir les méthodes d'accesseur, il doit revenir à la base de données d'une manière ou d'une autre. Si vous avez besoin de l'accesseur, vous devez l'attacher à la base de données en appelant le write_attribute.

Pour plus d'informations, vous pouvez consulter la documentation de « Ecraser accesseurs par défaut » à http://api.rubyonrails.org/classes/ActiveRecord/Base.html

J'espère que cela aide!

+0

Oui, le problème est là! Merci beaucoup pour votre aide! – wupher

1

Je pense que la question est parce que vous dites:

validates_uniqueness_of :email, :on => :create 

User.new ne peut pas être le déclenchement de cette validation. Essayez d'appeler duplicate_user.save! et voir si cela génère une erreur.

+0

non, il n'y a pas d'erreur jeter. – wupher

+0

et je cours la console, il peut encore enregistrer deux objet de courrier électronique en double. La photo est ici: http://cl.ly/a92100cd98829580d876 Je n'ai aucune idée de tout ce qui est faux. – wupher

0

Vous pouvez essayer comme suit

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