Como os valores são convertidos ao atribuir a um campo booleano no Rails ActiveRecord?

Versão curta da minha pergunta

No Rails ActiveRecord, se eu tiver um campo booleano e atribuir algo como "abc"ou2, então ele é lançado imediatamente parafalse. O valor que1 é lançado paratrueenil permanece comonil. Por que esse é o caso? Onde posso encontrar a documentação do Rails (ou a documentação do Ruby) que explica esse comportamento?

Versão longa da minha pergunta

Estou tendo dificuldade em entender como o Rails lida com tentativas de atribuir valores a umBoolean campo em um modelo Rails. Por exemplo, digamos que eu tenho umWebsite modelo que tem umString campo chamado:domain e umBoolean campo chamado:can_ssl.

Minha migração é assim:

class CreateWebsites < ActiveRecord::Migration
  def change
    create_table :websites do |t|
      t.string :domain
      t.boolean :can_ssl, :default => false

      t.timestamps
    end
  end
end

No meu arquivo de modelo, adiciono algumas regras de validação, para que fique assim:

class Website < ActiveRecord::Base
  validates :domain, :presence => true
  validates :can_ssl, :inclusion =>  { :in => [true, false] }
end

Simples o suficiente. Com base no que eu fiz, eu souesperando este:can_ssl só pode ser definido com os valorestrue oufalse, e nada mais. Qualquer outra coisa resultaria emvalid? serfalse.

Mas assim que começo a brincar no console, percebo que, tão cedo quanto a declaração de atribuição real, o valor que forneço está sendo reformulado paratrue oufalse (ounil) Quais são as regras que regem como um valor é convertido como umBoolean?

Exemplos do console:

w = Website.new
w.domain = 'stackoverflow.com'
w.can_ssl = true
w.can_ssl    # => true
w.valid?     # => true

w.can_ssl = nil
w.can_ssl    # => nil
w.valid?     # => false (so far so good)

w.can_ssl = 'abc'
w.can_ssl    # => false (How did 'abc' become the value false?)
w.valid?     # => true

w.can_ssl = 1
w.can_ssl    # => true (I guess it makes sense that 1 casts to true)
w.valid?     # => true

w.can_ssl = 2
w.can_ssl    # => false (But anything other than 1 casts to false?)
w.valid?     # => true

Então, com base no que eu fiz até agora, eupensar Eu posso concluir o seguinte:

Ao atribuir o valor1 outrue para umBoolean campo, o valor será imediatamente convertido comotrue e depois atribuído.Ao atribuirnil para umBoolean campo, o campo é realmente atribuídonil.Ao atribuir qualquer outra coisa (como umString ou qualquer número que não seja1), o valor será convertido imediatamente comofalse.

Estou entendendo isso corretamente? Estou faltando alguma coisa?

Estou tendo dificuldade em encontrar a documentaçãoBoolean tipo de campo no Rails, o que pode me dar esclarecimentos sobre isso.

questionAnswers(3)

yourAnswerToTheQuestion