Si tenemos un campo booleano en nuestro modelo que queremos que sea
obligatorio y lo intentamos hacer con presence: true
mira lo que ocurre.
Nuestro modelo option con dos campos un texto, y un boolean (is_correct)
class Option < ApplicationRecord
validates :text, presence: true
validates :is_correct, presence: true
end
En la base de datos las migraciones estan correctas.
ActiveRecord::Schema.define(version: 2018_08_29_112851) do
create_table "options", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "text"
t.boolean "is_correct"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
Si creamos un objeto o2 con todos los campos correctos y el campo
is_correct
a false
vemos como no es valido para Rails
2.5.1 :111 > o2
=> #<Option id: nil, text: "Option 2", created_at: nil, updated_at: nil, is_correct: false>
2.5.1 :110 > o2.valid?
=> false
Pero en cambio si este mismo objeto cambiamos la propiedad a true
vemos como
pasa a ser valido.
2.5.1 :112 > o2.is_correct = true
=> true
2.5.1 :114 > o2
=> #<Option id: nil, text: "Option 2", created_at: nil, updated_at: nil, is_correct: true>
2.5.1 :113 > o2.valid?
=> true
En rails para validar la presencia de un campo de tipo boolean tenemos que
hacerlo de otra forma. Para ello tenemos que usar inclusion:
de manera que
le indicamos si contiene algunos de los valores en nuestro modelo
class Option < ApplicationRecord
validates :text, presence: true
validates :is_correct, inclusion: {in: [true, false]}
end
Esta inforamcion la he sacado de la documantación oficial de Rails