Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 验证或不验证布尔字段的步骤_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 验证或不验证布尔字段的步骤

Ruby on rails 验证或不验证布尔字段的步骤,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,对模型的布尔字段进行验证有什么好处吗 我对确保布尔字段的存在进行了验证 validates :boolean_attribute, presence: true 布尔值_属性为false时失败。我在谷歌上搜索了一下,发现这些问题都与这个问题有关 然后添加了这个验证 validates :field, :inclusion => {:in => [true, false]} 这让我思考。我需要对布尔字段进行任何验证吗?它的价值永远是真的、假的或零对吗?即使有人恶意地试图把它改

对模型的布尔字段进行验证有什么好处吗

我对确保布尔字段的存在进行了验证

validates :boolean_attribute, presence: true
布尔值_属性为false时失败。我在谷歌上搜索了一下,发现这些问题都与这个问题有关


然后添加了这个验证

 validates :field, :inclusion => {:in => [true, false]}

这让我思考。我需要对布尔字段进行任何验证吗?它的价值永远是真的、假的或零对吗?即使有人恶意地试图把它改成一个数字,这种类型的人难道不会在意吗?或者上面的包含验证提供了一些安全性吗?

如果您想要真正的类型验证,我建议您查看gem。它将在类型强制之前对您的属性进行验证。类型强制可能有一些意外的行为,这表明只有一组特定的值是“真实的”


如果您接受一个
Boolean
nil
,那就不是真正的
Boolean
对吗?这是
true
false
或第三个值,
nil
您是否应该验证布尔属性以包含在
[true,false]
中完全取决于您的用例

您已经正确地识别出,在没有验证其他代码的情况下,Rails中的布尔字段将始终是(在类型强制之后)
true
false
nil
。Rails不会将
nil
强制为
false
。如果将模型的布尔属性设置为
nil
,并将其保存,则稍后从数据库中获取该属性时,该属性将为
nil
,而不是
false

您可以将
nil
视为布尔字段的“第三状态”。考虑一个简单的调查应用程序,让用户保存一个未完成的调查稍后完成。假设用户保存了一个不完整的调查,但问题“你吃肉吗?”未回答。您不希望在数据库中存储
false
,因为这表示用户回答了“否”。当用户回来完成调查时,您希望该问题仍然没有得到回答,因此您希望在数据库中存储
nil

在上述情况下,不验证是否包含在
[true,false]
中是适当的(并且是必要的)

然而,作为经验法则,我想说的是,在所有其他情况下,也就是说,在任何情况下,如果您不特定需要
nil
值,那么您应该验证布尔字段是否包含在
[true,false]

当然,如果您允许
nil
,您需要小心,因为您知道,
nil
在Ruby中是一个错误的值。在可能依赖于某个值的真实性或错误性的地方,必须显式检查“零”。也就是说,与此相反:

if !is_meat_eater
  unanswered_questions << :is_meat_eater
end

您不需要验证
布尔值
字段,如果它不是真的,那么它就是假的

这样,无论发生什么情况,布尔值总是有一定的值:

#db/migrate/add_boolean_column_______.rb
class AddBooleanColumn < ActiveRecord::Migration
   def change
      change_table :table do |t|
         t.boolean :field, default: false
      end
   end
end 
\db/migrate/add\u boolean\u column\uuuuuuuuuuuuu.rb
类AddBooleanColumn

这样,我甚至不会包含任何验证。系统将确保您将其设置为真或假-这取决于您作为开发人员。

是的,我通常不介意。如果该字段是必需的-您可以使用上述技巧中的包含,并且确保在列上放置
null:false
,如果您需要值为
true
false
,但不是
nil
,则需要使用验证。如果
true
false
nil
都正常,则不需要验证。哪一个对你来说是正确的完全取决于你的用例。@Jordan:我对nil很满意,只要ruby验证它为false,并且没有可能破坏系统的场景。有吗?谢谢你@Jordan+1的场景。
#db/migrate/add_boolean_column_______.rb
class AddBooleanColumn < ActiveRecord::Migration
   def change
      change_table :table do |t|
         t.boolean :field, default: false
      end
   end
end