Почему ложь делает недействительным 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 к истинному и повторно выполненному тест.Работает! Я думаю, что это, вероятно, имеет некоторое отношение к полю, являющемуся булевской переменной, но я не могу понять это. Действительно ли это - ошибка в направляющих? или я делаю что-то не так?

53
задан aarona 21 May 2010 в 22:21
поделиться

1 ответ

Смотрите API docs...

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

103
ответ дан 7 November 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: