2010-05-21 2 views
45

Ok шаги, чтобы воспроизвести это:Почему false делает недействительным validates_presence_of?

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

затем идут в миграции и добавить не утратившим по умолчанию, опубликованные ложь:

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 

Теперь мигрирующие изменения и запустить тесты:

prompt>rake db:migrate 
prompt>rake 

В это время вы не должны получать никаких ошибок. Теперь отредактируйте модель, так что вы validate_presence_of опубликованы:

class EventService < ActiveRecord::Base 
    validates_presence_of :published 
end 

Теперь отредактируйте модульное тестирование event_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 

Вы получите ошибку в тесте , Теперь установите e.published в true и повторите тест. ОНО РАБОТАЕТ! Я думаю, что это, вероятно, имеет какое-то отношение к тому, что поле является логическим, но я не могу понять это. Это ошибка в рельсах? или я делаю что-то неправильно?

+0

где приходит EventServer от? (последний кодовый блок) –

+0

oops! EventServer должен быть EventService ... это просто класс, который я написал. Это не только рельсы или любой другой API. – DJTripleThreat

ответ

92

Посмотреть API docs ...

Если вы хотите, чтобы проверить наличие булева поля (где реальные значения являются истинными и ложными), вы хотите использовать validates_inclusion_of: field_name,: в = > [true, false]. не

+0

lol, просто нашел это в API тоже. Я приму этот ответ через пару минут (его говорит, что я еще не могу) спасибо за быстрый ответ! – DJTripleThreat

+3

Действительно уродливый взлом ... но он заставляет его работать. Благодаря! – Gawyn

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

больше не работает в некоторых версиях после 1.3.0 из Shoulda matchers, когда вы тестируете, что только логические значения принимаются модели.

Вместо этого, вы должны сделать что-то вроде этого:

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) } 

Вы можете увидеть обсуждение here.

Был частично исправить это, что теперь предупреждает, если вы пытаетесь сделать это here

Смежные вопросы