The uniqueness validator of ActiveRecord verfügt über Optionen zum Überspringen der Validierung, wenn der Wert null oder leer ist. Auch wenn ich beide Parameter auf "true" (das Standardverhalten) setze, kann ich einen Datensatz mit nil und leer erstellen, bevor die Validierung eintritt. Ich benutze die Standard-SQlite3-Datenbank sqlite3-ruby (1.2.5).validates_uniqueness_of übergibt null oder leer (ohne allow_nil und allow_blank)
Zur Klarstellung bearbeiten: Ich bekomme das erwartete Ergebnis, wenn ich validates_presence_of
zum Modell hinzufügen. Ich dachte, dass das Standardverhalten von validates_uniqueness_of
dies überflüssig machen würde.
Testfall:
rails validation_test
cd validation_test/
script/generate Model Thing identification:string
rake db:migrate
Inhalt von 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
+1, weil dies ein Modell ist, wie man eine Frage stellt. Du hast klar gesagt, was du getan hast, was du gesehen hast und was du erwartet hast. – jdl
Danke. Aber es scheint, dass dies nicht daran hindert, missverstanden zu werden. :) – Roman