kenjuの日記

About Programming, Mathematics and Security

Railsでtruthy/falsyな文字列をBoolean型に変換する

tl;dr

  • Controllerでパラメーターとして渡ってきた"true", “false"といった文字列をBoolean型に変換する場合、Rails v5以降ではActiveRecord::Type::Boolean.new.castを使う
  • Rails v4までの場合はActiveRecord::Type::Boolean.new.type_cast_from_databaseを使う
  • バージョン差異を吸収したConcernを書いておくと移行期などは便利

実装

以下のConcernを用意する。

app/controllers/concerns/bool_castable.rb:

module Concerns
  module BoolCastable
    extend ActiveSupport::Concern

    private

    def cast_to_bool(value)
      if ActiveRecord::VERSION::MAJOR == 5
        ActiveRecord::Type::Boolean.new.cast(value)
      else
        ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
      end
    end
  end
end

すると、Controller側で以下のように書ける:

class EntryController < ApplicationController
  include Concerns::BoolCastable

  def create(is_draft: "false")
    if cast_to_bool(is_draft)
       # "is_draft"に"true"が渡されていた時の処理
    end
  end
end