validates_uniqueness_of ne fonctionnent pas
-
27-09-2019 - |
Question
Il est pas une sorte de problème de synchronisation I readed avant. Le code est assez simple. Le modèle:
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 => "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
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ée deux objets utilisateur avec la même adresse e-mail. Il va bien, aucun message de validation se produit, les deux objets ont tous deux insérés dans la table. Je ne sais pas ce qui ne va pas avec elle.
Mes rails version 2.3.8 et rspc est 1.3.0.
La solution
Je crois que le problème est la ligne de attr_accessor
que vous avez. Si vous avez les noms de colonnes, l'accesseur remplace le nom de la colonne et qui fait partie seulement de la classe et ne se soucient pas de l'unicité. Si vous allez avoir les accesseurs alors il a besoin de revenir à la base de données d'une certaine façon. Si vous avez besoin d'avoir l'accesseur, alors vous devez l'attacher à la base de données en appelant write_attribute
.
Pour plus d'informations, vous pouvez consulter la documentation pour « Écrasement accesseurs par défaut » à http: //api.rubyonrails.org/classes/ActiveRecord/Base.html
J'espère que cela aide!
Autres conseils
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.
Vous pouvez essayer comme suit
attr_accessible :email
validates_uniqueness_of :email, :on => :create, :message => "must be unique"