Ответ 1
Смотрите API-документы...
Если вы хотите проверить наличие логического поля (где действительные значения являются истинными и ложными), вы захотите использовать validates_inclusion_of: field_name,: in = > [true, false].
Ok шаги для воспроизведения:
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
теперь переносите свои изменения и запускайте свои тесты:
prompt>rake db:migrate
prompt>rake
В это время вы не должны получать никаких ошибок. Теперь отредактируйте модель так, чтобы вы опубликовали validate_presence_of:
class EventService < ActiveRecord::Base
validates_presence_of :published
end
Теперь отредактируйте unit test 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
и выполните rake:
prompt>rake
Вы получите ошибку в тесте. Теперь установите e.published в true и повторите тест. ОНО РАБОТАЕТ! Я думаю, что это, вероятно, имеет какое-то отношение к тому, что поле является логическим, но я не могу понять это. Это ошибка в рельсах? или я делаю что-то неправильно?
Смотрите API-документы...
Если вы хотите проверить наличие логического поля (где действительные значения являются истинными и ложными), вы захотите использовать validates_inclusion_of: field_name,: in = > [true, false].
validates_inclusion_of :your_field, :in => [true, false]
больше не работает для некоторых версий после 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) }
Вы можете увидеть обсуждение здесь.
Было частичное исправление для этого, которое теперь предупреждает, если вы пытаетесь сделать это здесь