validates_uniqueness_of non funzionano
-
27-09-2019 - |
Domanda
Non è un qualche tipo di problema di sincronizzazione sopra letto prima. Il codice è abbastanza semplice. Il modello:
class User < ActiveRecord::Base
attr_accessor :name, :email
validates_uniqueness_of :email, :on => :create, :message => "must be unique"
end
Il 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
ho eseguito il test, e ottengo il messaggio di errore:
----------------------------
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
-----------------------------
ho eseguito lo script / console, e creare due oggetti utente con lo stesso indirizzo di posta elettronica. Va bene, si verificano alcun messaggio di convalida, i due oggetti entrambi hanno inserito nella tabella. Non so cosa c'è che non va.
Il mio rotaie versioni 2.3.8 e 1.3.0 è RSPC.
Soluzione
Credo che il problema è la linea attr_accessor
che avete. Se si dispone di quei nomi delle colonne, la funzione di accesso sostituirà il nome della colonna e che è solo una parte della classe e non si preoccupano di unicità. Se avete intenzione di avere i metodi di accesso quindi ha bisogno di tornare alla base di dati in qualche modo. Se avete bisogno di avere la funzione di accesso, allora avete bisogno di legarlo al database chiamando write_attribute
.
Per ulteriori informazioni è possibile consultare la documentazione per "Sovrascrittura di accesso di default" a http: //api.rubyonrails.org/classes/ActiveRecord/Base.html
Spero che questo aiuta!
Altri suggerimenti
Credo che il problema è dovuto al fatto che stai dicendo:
validates_uniqueness_of :email, :on => :create
User.new potrebbe non essere innescare questa convalida. Prova a chiamare duplicate_user.save! e vedere se questo genera un errore.
Si può provare come seguire
attr_accessible :email
validates_uniqueness_of :email, :on => :create, :message => "must be unique"