[Ruby on Rails] Boolean に変換するメソッドを Object に実装する

2013.02.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

最近案件で携わることもあり Ruby on Rails を勉強しています。 今回は Object に「Boolean に変換する to_b メソッド」を実装してみたのでその手順をメモしておきます。

to_b メソッドを実装する

まずは Object クラスに to_b メソッドを実装します。クラス定義を Object にすることで既存の Object クラスにメソッドが追加されます。
まず一番最初に String を downcase してから検証するようにします。あとは思いつくままに true が返ってきそうな値を羅列していきます。

to_b.rb

class Object
  def to_b
    compare_value = self.class == String ? self.downcase : self
    case compare_value
      when "yes", "true", "ok", true, "1", 1, :true, :ok, :yes
        true
      else
        false
    end
  end
end

initializers で ファイルを読み込む

次に上記で作成した rb ファイルを初期化時に読み込みます。初期化時に実行したい処理を記述した rb ファイルを initializers フォルダ内に保存します。ファイル名は自由です。

initializers/core_ext.rb

# lib/core_ext/*.rb を読む
Dir.glob(File.join(Rails.root, 'lib', '*_ext', '*.rb')) do |file|
  load file
end

動作確認

以上で実装完了です。動作確認しましょう!

bundle exec rails c
irb(main):001:0> 'yes'.to_b
=> true

ちゃんと変換されました!Spec も書いておきます。

to_b_spec.rb

require 'spec_helper'
describe Object do
  describe 'to_b' do
    context 'return true' do
      it { true.to_b.should be }
      it { 'yes'.to_b.should be }
      it { 'YES'.to_b.should be }
      it { 'true'.to_b.should be }
      it { 'TRUE'.to_b.should be }
      it { 'ok'.to_b.should be }
      it { 'OK'.to_b.should be }
      it { '1'.to_b.should be }
      it { 1.to_b.should be }
      it { :yes.to_b.should be }
      it { :true.to_b.should be }
      it { :ok.to_b.should be }
    end
    context 'return false' do
      it { false.to_b.should_not be }
      it { 'no'.to_b.should_not be }
      it { 'NO'.to_b.should_not be }
      it { 'false'.to_b.should_not be }
      it { 'FALSE'.to_b.should_not be }
      it { [].to_b.should_not be }
    end
  end
end

実行してみます。

bundle exec rspec spec/lib/core_ext/to_b_spec.rb
Object
  to_b
    return true
      should be
      should be
      should be
      should be
      should be
      should be
      should be
      should be
      should be
      should be
      should be
      should be
    return false
      should not be
      should not be
      should not be
      should not be
      should not be
      should not be

Finished in 0.0262 seconds
18 examples, 0 failures

Randomized with seed 27098

無事にテストが通りました。
以上のような感じで既存のクラスを自由に拡張することができます!

まとめ

今後も勉強するなかで便利な実装方法やなるほど!と思うようなことを発見したら備忘録として掲載していきたいと思います。「当たり前じゃー!」とかいう内容もあるかも知れませんが温かい目で見ていただければと思います。w
少しでも誰かのお力に添えられれば幸いです!