- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
The uniqueness validator of ActiveRecord如果值为 nil 或空白,则可以选择跳过验证。即使我将两个参数设置为 true(默认行为),我也可以在验证命中之前创建一条包含 nil 和空白的记录。我使用默认的 SQlite3 数据库 sqlite3-ruby (1.2.5)。
编辑以澄清:如果将 validates_presence_of
添加到模型,我会得到预期的结果。我认为 validates_uniqueness_of
的默认行为会让这个变得多余。
测试用例:
rails validation_test
cd validation_test/
script/generate Model Thing identification:string
rake db:migrate
app/models/thing.rb 的内容:
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification
end
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
为什么前两个作品会通过?
谢谢
最佳答案
您对默认行为的理解是错误的。来自 the docs :
: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, it includes nil too).
将 allow_blank
设置为 true,我在 Rails 2.3.4 中看到以下行为。
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification, :allow_blank => 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">
编辑:进行澄清。
添加 validates_presence_of
对于您想要执行的操作来说是正确的。它不是多余的,因为它正在检查完全不同的错误情况。它还有自己的错误消息,这对用户来说很重要。
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification, :allow_blank => true
validates_presence_of :identification
end
关于ruby-on-rails - validates_uniqueness_of 传递 nil 或空白(没有allow_nil 和allow_blank),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1480227/
我正在尝试在 RoR 中构建自己的应用程序。 您如何看待下面的代码。 class Book < ApplicationRecord validates :price, presence:
我根据它们的 active_state 验证 Realty 对象,所以如果它是 pending,多个字段可以是 blank。 with_options :if => Proc.new { |a| a.
我正在阅读“使用 Rails 进行敏捷 Web 开发”这本书,并且我正在他们进行验证的部分,如下所示: class Product < ActiveRecord::Base validates :
我对 Rails 还很陌生,发现了一个小片段来逐步验证存在性和唯一性:首先检查存在性,然后检查唯一性。 validates :email, :presence => true, :allow_blan
我有一个有效的唯一性测试: it { should validate_uniqueness_of(:name).case_insensitive } 然而,当我尝试对名称进行类似的测试时,它失败了 i
我想弄清楚以下两者之间的区别: validates :foo, presence: false validates :foo, allow_blank: true 当我使用 presence: fal
我正在尝试将表单中的时间字段设为可选。我这样做: 然而,当它被提交时,由于 time_select 会自动提交默认日期信息,这就是 params 的样子: end_time(1i): '2000'
我在测试模型验证时遇到问题,allow_blank。我对 RSpec 比较陌生,但在这种情况下,我认为问题在于验证。 这是我的模型: class ComicBook to be valid, but
我是一名优秀的程序员,十分优秀!