環境
Ruby2.6
Rails4.0
Booleanの判断の仕方
RubyにはBooleanClassというは存在していません。その代わり、FalseClass、TrueClassというのが存在します。なぜ、そのような設計をしたのだろうか。他言語から移行した人からしてみれば訝しく思うのも無理はない。
Boolean型つまり、FalseClassかTrueClassかの判断は、このようなやり方で判断することになります。
if params.is_a?(FalseClass) or params.is_a?(TrueClass)
puts "いわゆるBoolean型です"
else
puts "いわゆるBoolean型ではありません"
end
テスト結果
params = true # いわゆるBoolean型です
params = True # エラーになります
params = TRUE # エラーにはならないがwarningになる(広義の意味でエラー)
params = false # いわゆるBoolean型です
params = False # エラーになります
params = FALSE # エラーにはならないがwarningになる(広義の意味でエラー)
params = "" # いわゆるBoolean型ではありません
params = nil # いわゆるBoolean型ではありません
params = 0 # いわゆるBoolean型ではありません
params = [] # いわゆるBoolean型ではありません
params = "aa" # いわゆるBoolean型ではありません
params = 12 # いわゆるBoolean型ではありません
他言語から移行してきた人は目を疑うかも分かりませんが、True、Falseは有効になりません。true、falseと書きましょう。
Railsで文字列をtrue or falseに変換する
Railsで開発をしていて、Viewでチェックボックスにチェックをした場合はtrue、外した場合はfalseをGETで送信させることがありました。GETで送信されるデータは当然文字列です。TrueClassの属性を持たせたまま送信することはできません。
trueで送信したところで、実際には"true"という文字列で送信されます。Railsのコントローラーの中でparamsで拾った後、内部的に"true" or "false"ではなく、true or falseで判断させたい場合は、TrueClass、FalseClassに変換する必要があります。
その場合のやり方がこちらです。
params = {checkflg: "true"}
boolean = params[:checkflg] == "true"
if boolean.is_a?(TrueClass)
puts "trueです"
elsif boolean.is_a?(FalseClass)
puts "falseです"
elsif
puts "いわゆるBoolean型ではありません"
end
"true"であれば、trueを返し、"true"以外であれば、falseを返します。