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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top