ruby on rails - validations - validates_uniqueness_of pasa en cero o en blanco(sin allow_nil y allow_blank)
validations in rails (1)
Estás equivocado sobre el comportamiento predeterminado. De los documentos :
: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).
Estableciendo ambos como verdaderos, veo el siguiente comportamiento con 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">
Editar: abordar su aclaración. Agregar un validates_presence_of
sería correcto para lo que estás tratando de hacer. No es redundante, ya que está buscando un caso de error completamente diferente. También tiene su propio mensaje de error, que será importante para el usuario.
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification, :allow_nil => true, :allow_blank => true
validates_presence_of :identification
end
El validador de singularidad de ActiveRecord tiene opciones para omitir la validación si el valor es nulo o está en blanco. Incluso si establezco ambos parámetros en verdadero (el comportamiento predeterminado) puedo crear un registro con cero y en blanco antes de que la validación llegue. Utilizo la base de datos predeterminada SQlite3 sqlite3-ruby (1.2.5).
Edite para aclarar: obtengo el resultado esperado si agrego validates_presence_of
al Modelo. Pensé que el comportamiento predeterminado de validates_uniqueness_of
lo haría redundante.
Caso de prueba:
rails validation_test
cd validation_test/
script/generate Model Thing identification:string
rake db:migrate
Contenido de la aplicación / modelos / thing.rb:
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification
end
Consola Rails:
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
¿Por qué pasan las dos primeras creaciones?
Gracias