为什么false使validates_presence_of失效?

好的步骤来重现这一点:

prompt> rails test_app prompt> cd test_app prompt> script/generate model event_service published:boolean 

然后进入迁移并添加不为null,默认发布为false:

 class CreateEventServices < ActiveRecord::Migration def self.up create_table :event_services do |t| t.boolean :published, :null => false, :default => false t.timestamps end end def self.down drop_table :event_services end end 

现在迁移您的更改并运行testing:

 prompt>rake db:migrate prompt>rake 

你现在应该没有错误。 现在编辑模型,以便您发布validate_presence_of:

 class EventService < ActiveRecord::Base validates_presence_of :published end 

现在编辑unit testingevent_service_test.rb

 require 'test_helper' class EventServiceTest < ActiveSupport::TestCase test "the truth" do e = EventService.new e.published = false assert e.valid? end end 

并运行耙:

 prompt>rake 

你会在testing中得到一个错误。 现在将e.published设置为true,然后重新运行testing。 有用! 我认为这可能与该字段布尔值有关,但我无法弄清楚。 这是一个错误的轨道? 还是我做错了什么?

查看API文档 …

如果你想validation一个布尔型字段的存在(真实的值是true和false),你可以使用validates_inclusion_of:field_name,:in => [true,false]。

 validates_inclusion_of :your_field, :in => [true, false] 

当您testing只有布尔值被您的模型接受时,在shoulda匹配器的1.3.0之后的某些版本不再适用。

相反,你应该这样做:

 it { should allow_value(true).for(:your_field) } it { should allow_value(false).for(:your_field) } it { should_not allow_value(nil).for(:your_field) } 

你可以在这里看到讨论。

如果你正在尝试在这里做这个,现在警告了这个问题