Te recomendamos que revises esta solución en un ambiente controlado antes de pasarlo a producción, saludos.
Si usa Rails 5, puede hacer ActiveModel::Type::Boolean.new.cast(value)
.
En Rails 4.2, utilice ActiveRecord::Type::Boolean.new.type_cast_from_user(value)
.
El comportamiento es ligeramente diferente, como en Rails 4.2, el true valor y false se comprueban los valores. En Rails 5, solo false los valores están marcados, a menos que los valores sean nulos o coincidan con un false valor, se supone que es true. Los valores falsos son los mismos en ambas versiones:
FALSE_VALUES = [false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"]
Rieles 5 Fuente: https://github.com/rails/rails/blob/5-1-stable/activemodel/lib/active_model/type/boolean.rb
def true?(obj)
obj.to_s.downcase == "true"
end
Con frecuencia he usado este patrón para extender el comportamiento central de Ruby para que sea más fácil lidiar con la conversión de tipos de datos arbitrarios a valores booleanos, lo que hace que sea realmente fácil lidiar con diferentes parámetros de URL, etc.
class String
def to_boolean
ActiveRecord::Type::Boolean.new.cast(self)
end
end
class NilClass
def to_boolean
false
end
end
class TrueClass
def to_boolean
true
end
def to_i
1
end
end
class FalseClass
def to_boolean
false
end
def to_i
0
end
end
class Integer
def to_boolean
to_s.to_boolean
end
end
Así que digamos que tienes un parámetro foo
que puede ser:
- un número entero (0 es falsetodos los demás son true)
- a true booleano (true/false)
- a string (“true”, “false”, “0”, “1”, “VERDADERO”, “FALSO”)
- nulo
En lugar de usar un montón de condicionales, puedes simplemente llamar foo.to_boolean
y hará el resto de la magia por ti.
En Rails, agrego esto a un inicializador llamado core_ext.rb
en casi todos mis proyectos ya que este patrón es muy común.
## EXAMPLES
nil.to_boolean == false
true.to_boolean == true
false.to_boolean == false
0.to_boolean == false
1.to_boolean == true
99.to_boolean == true
"true".to_boolean == true
"foo".to_boolean == true
"false".to_boolean == false
"TRUE".to_boolean == true
"FALSE".to_boolean == false
"0".to_boolean == false
"1".to_boolean == true
true.to_i == 1
false.to_i == 0
Tienes la opción de añadir valor a nuestro contenido cooperando tu veteranía en los comentarios.