2017-07-17 84 views
0

我有以下任務模式:工廠女孩沒有存在驗證

class Task < ApplicationRecord 
    validates :body, presence: true, length: { minimum: 10 } 
    validates :complete, presence: true 
end 

及以下FactoryGirl對象創建代碼:

FactoryGirl.define do 
    factory :incomplete_task, class: :Task do 
    body { Faker::Pokemon.name + Faker::Pokemon.name } 
    complete false 

    factory :complete_task do 
     complete true 
    end 
    end 
end 

在我的任務控制器的測試中,我有:

describe '#update' do 
    it 'toggles completion' do 
     incomplete_task = create :incomplete_task 
     toggle_completion(incomplete_task) 
     expect(incomplete_task.complete).to be_true 
    end 
    end 

但是,由於FG創建的任務對象中缺少字段'complete',因此失敗:

Failures: 
    1) TasksController#update toggles completion 
    Failure/Error: incomplete_task = create :incomplete_task 

    ActiveRecord::RecordInvalid: 
     Validation failed: Complete can't be blank 

這是怎麼回事?我正確地設置了完整的屬性,正文檢查正常。這裏是任務的架構,以及:

# Table name: tasks 
# 
# id   :integer   not null, primary key 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# body  :text 
# complete :boolean 

回答

0

在紅寶石,false被認爲是空白(不存在)的值(用nil,空字符串/陣列和其他空白值一起)。因此,存在驗證器正確拒絕該記錄。

documentation有如下評論:

如果您想驗證一個布爾字段(其中實際值是truefalse)的存在,你將要使用validates_inclusion_of :field_name, in: [true, false]

這是由於Object#blank?處理布爾值的方式:false.blank? # => true