[Ruby on Rails] Boolean に変換するメソッドを Object に実装する
最近案件で携わることもあり 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
少しでも誰かのお力に添えられれば幸いです!