このエントリーをはてなブックマークに追加

2016年12月12日月曜日

ObjectクラスにBooleanへの変換メソッド「to_b」を追加する

 こんにちは、Hiroです。本日は、Ruby on Rails上であればちょっと便利なメソッドをObjectクラスに追加する方法を紹介します。
 皆さんもObjectを数値(Integer)に変換する「to_i」や文字列(String)に変換する「to_s」などは使ったことがあると思います。(下記のように使います。)
[1] pry(main)> "1".to_i
=> 1
[2] pry(main)> 1.to_s
=> "1"

 今回は、あまり使用頻度は高くはないのですが、Objectを論理値(Boolean)に変換するためのメソッド「to_b」というのを実装してみようと思います。


1. to_bメソッドの使い方

まずは、いきなり使い方からですが、下記に例を記載します。APIでJSONが送信されてくるような時に、params[:spot_request]に文字列で"true"または、"false"が入っていて、"true"なのか"false"なのかで処理を分ける場合のものです。
def create
  if params[:spot_request].to_b
      # TODO: 申請処理をする
  else
      # TODO: 通常の処理をする
  end
end


2. to_bメソッドの実装内容

to_bメソッドですが、今回は文字列・数値・シンボルなどから変換できるようにしたいと思います。下記のような形で、「lib/extensions/object/to_b.rb」として保存します。(trueとしたいものが他にあれば、追加してみるのもよいと思います。)
class Object
  def to_b
    target_value = self.class == String ? self.downcase : self
    case target_value
    when 'yes', 'true', 'ok', '1', :yes, :true, :ok, 1, true
      true
    else
      false
    end
  end
end


3. to_bメソッドがアプリケーション内で利用できるように読み込ませる

to_bメソッドをcontrollerやmodel内で利用できるようにto_b.rbを読み込ませる必要があります。「config/initializers」配下に新しいファイルを作っても構いませんが、今回は「config/application.rb」のファイルの末尾に下記を追加します。
Dir[Rails.root.join('lib/extensions/**/*.rb')].sort.each do |file|
  require file
end


4. to_bメソッドを実際に使ってみる

これで、to_bメソッドが使えるようになりましたので、簡単に実行結果をのせておきます。
[1] pry(main)> "true".to_b
=> true
[2] pry(main)> "false".to_b
=> false
[3] pry(main)> 1.to_b
=> true
[4] pry(main)> 0.to_b
=> false
[5] pry(main)> :true.to_b
=> true
[6] pry(main)> :false.to_b
=> false

 いかがでしたでしょうか。今回は単純なメソッドをObjectクラスに追加してみましたが、同じような方法で既存のクラスにメソッドを追加したりすることができますので、ぜひ色々と試してみてください。

0 件のコメント:

コメントを投稿