validates_uniqueness_of gibt nil oder leer (ohne allow_nil und allow_blank)
-
18-09-2019 - |
Frage
Die Einzigartigkeit Validator von Active hat eine Option zu überspringen Validierung, wenn der Wert null oder leer. Auch wenn ich beiden Parameter auf true (das Standardverhalten) einstellen kann ich einen Datensatz mit Null und leer, bevor der Validierung Treffern erstellen. Ich benutze den Standard SQLite3 Datenbank-sqlite3-ruby (1.2.5).
Bearbeiten zur Klarstellung: Ich habe das erwartete Ergebnis erhalten, wenn ich validates_presence_of
zum Modell hinzufügen. Ich dachte, dass das Standardverhalten von validates_uniqueness_of
würde diese überflüssig machen.
Testfall:
rails validation_test
cd validation_test/
script/generate Model Thing identification:string
rake db:migrate
Der Inhalt des app / models / thing.rb:
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification
end
Rails-Konsole:
script/console
Loading development environment (Rails 2.3.4)
>> Thing.create!
=> #<Thing id: 1, identification: nil, created_at: "2009-09-26 01:49:32", updated_at: "2009-09-26 01:49:32">
>> Thing.create! :identification => ""
=> #<Thing id: 2, identification: "", created_at: "2009-09-26 01:49:42", updated_at: "2009-09-26 01:49:42">
>> Thing.create! :identification => ""
ActiveRecord::RecordInvalid: Validation failed: Identification has already been taken
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/validations.rb:1090:in `save_without_dirty!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/dirty.rb:87:in `save_without_transactions!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:200:in `save!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:182:in `transaction'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:200:in `save!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:200:in `save!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/validations.rb:1059:in `create!'
from (irb):3
>> Thing.count
=> 2
Warum die ersten beiden Kreationen passieren?
Danke
Lösung
Sie irren über das Standardverhalten. Aus der Dokumentation :
:allow_nil - If set to true, skips this validation if the attribute is nil (default is false).
:allow_blank - If set to true, skips this validation if the attribute is blank (default is false).
Einstellung sowohl die wahr, ich sehe das folgende Verhalten mit Rails 2.3.4.
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification, :allow_blank => true, :allow_nil => true
end
>> Thing.create! :identification => ""
=> #<Thing id: 6, identification: "", created_at: "2009-09-26 03:09:48", updated_at: "2009-09-26 03:09:48">
>> Thing.create! :identification => ""
=> #<Thing id: 7, identification: "", created_at: "2009-09-26 03:09:49", updated_at: "2009-09-26 03:09:49">
>> Thing.create! :identification => nil
=> #<Thing id: 8, identification: nil, created_at: "2009-09-26 03:09:52", updated_at: "2009-09-26 03:09:52">
>> Thing.create! :identification => nil
=> #<Thing id: 9, identification: nil, created_at: "2009-09-26 03:09:53", updated_at: "2009-09-26 03:09:53">
Bearbeiten. Addressing Ihre Klarstellung
Hinzufügen eines validates_presence_of
wäre richtig für das, was Sie zu tun versuchen. Es ist nicht überflüssig, da es für einen völlig anderen Fehlerfall zu überprüfen. Es ist auch eine eigene Fehlermeldung hat, die für den Anwender von Bedeutung sein wird.
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification, :allow_nil => true, :allow_blank => true
validates_presence_of :identification
end