验证Rspec和Rails中的布尔值

TK.*_*TK. 9 activerecord rspec ruby-on-rails

我很困惑如何验证Rspec和Rails中的布尔值.我理解除Ruby 之外的所有内容,false并将nil其视为trueRuby.但是当我使用MySQL和Rails时,它使用1for true0for 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)

Cha*_*cey 7

这是一个很好的讨论,有一些重要的观点:Rails自动验证布尔字段,false值将导致"presence"验证失败,如果你想确保一个布尔字段,那么需要一个明确查找真假设置的自定义验证不是零但具有真正的真假价值.

Rails 3.x的快速更新是:包含帮助器:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion

使用此帮助程序,验证布尔字段具有true或false值如下所示:

validates :superuser, :inclusion => {:in => [true, false], :message => 'requires a true or false value' }
Run Code Online (Sandbox Code Playgroud)

该消息是可选的,并且如文档所述,将默认为"未包含在列表中".

在线共识似乎并不是要明确验证是真还是假,而是要让铁路处理它.然而,我遇到了一种情况,即显式验证在数据库中发现问题(MySql tinyint字段设置为2或4而不是1)导致了一种奇怪的行为.字段可以设置为true或false,但无法将该值作为布尔值读回.换句话说,Rails验证传递了它,但显式包含验证标记了数据库配置错误的所有情况.因此,这可能是一个很好的理由去验证那些条目.希望这可以帮助.查尔斯


edg*_*ner 1

一件重要的事情是 ActiveRecord 在幕后进行类型转换,因此您不必担心数据库如何存储布尔值。您甚至不需要验证字段是否为布尔值,只要在准备迁移时将该字段设置为布尔值即可。您可能想通过模型类中的声明来确保该字段不是nil这样。validates_presence_of :superuser

  • 实际上:如果“:superuser”的值为“false”,“validates_presence_of :superuser”将使模型无效。 (8认同)