rails是否有像validates_numericality_ofboolean 那样的验证器,还是需要自己滚动?
我很困惑如何验证Rspec和Rails中的布尔值.我理解除Ruby 之外的所有内容,false并将nil其视为trueRuby.但是当我使用MySQL和Rails时,它使用1for true和0for false(如果我的理解是正确的).
我有以下型号规格.我想测试superuser属性的布尔值.
我的规范和实现代码是否特定于特定数据库(如MySQL和PostgreSQL)?
require 'spec_helper'
describe User do
before(:each) do
@valid_attributes = {
:username => "mike",
:password => "super_encryped_password",
:email => "mike@example.com",
:superuser => true
}
end
it "should create a new instance given valid attributes" do
User.create!(@valid_attributes)
end
it "should have true or false for superuser" do
@valid_attributes[:superuser] = "hello"
User.new(@valid_attributes).should have(1).error_on(:superuser)
end
end
Run Code Online (Sandbox Code Playgroud)我的模型中有此验证:
validates_inclusion_of :imported, :in => [true, false]
Run Code Online (Sandbox Code Playgroud)
但仍然允许字符串和 Fixnums。这个 Shoulda 宏返回 2 个失败:
should_not_allow_values_for :imported, "blah", 42
Run Code Online (Sandbox Code Playgroud)
我已经通过在测试中执行此操作来检查宏没有错:
@item.imported = 42
assert !@item.save
Run Code Online (Sandbox Code Playgroud)
我得到了这个失败:
<false> is not true.
Run Code Online (Sandbox Code Playgroud)
这是 schema.rb 中的相关行:
t.boolean "imported"
Run Code Online (Sandbox Code Playgroud) 我需要验证Rails ActiveRecord对象的布尔字段.我用这个问题的常见解决方案:
validates :boolean_field, :inclusion => { :in => [true, false] }
Run Code Online (Sandbox Code Playgroud)
但是虽然这个解决方案解决了验证false值的问题,但它仍然允许将字符串保存到boolean_field:
my_object.boolean_field = "string"
my_object.save # => true
my_object.boolean_field # => false
Run Code Online (Sandbox Code Playgroud)
如果我将包含指定为[true, false]?为什么会发生这种情况?更重要的是,我如何仅验证真值和假值?
PS如果这个问题很重要,我正在使用PostgreSQL.