Почему ложь аннулирует validates_presence_of? - PullRequest
52 голосов
/ 21 мая 2010

Хорошо, чтобы воспроизвести это:

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

, затем перейдите в миграцию и добавьте не нуль, а значение по умолчанию, опубликованное в 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

Теперь отредактируйте модульный тест 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 и перезапустите тест. ОНО РАБОТАЕТ! Я думаю, что это, вероятно, связано с тем, что поле является логическим, но я не могу понять это. Это ошибка в рельсах? или я что-то не так делаю?

Ответы [ 2 ]

102 голосов
/ 21 мая 2010

См. API документы ...

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

7 голосов
/ 22 октября 2014
validates_inclusion_of :your_field, :in => [true, false]

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

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

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

Вы можете посмотреть обсуждение здесь .

Это было частичное исправление, которое теперь предупреждает, если вы пытаетесь это сделать здесь

...