Object#presence と Object#try という便利なメソッドがあることをご存知ですか?この2つのメソッドはとっても便利なのでちょっと紹介してみます。

Object#presence メソッド

これは以下のような定義となっています。

def presence
  self if present?
end

present? メソッドというのはみんな大好き blank? の反対のメソッド (!blank?) です。

つまり、nil, false, [](空配列), {}(空ハッシュ), ""(空文字列), " "(半角スペースだけの文字列)であれば false、それ以外であれば true になります(blank? って半角スペースだけの文字列を true と判定するの知ってました?)。

で、この presence メソッドというのは present? メソッドで評価した結果が true であれば self を、無ければ nil を返します。こんな感じ。

"foo".presence #=> "foo"
[].presence    #=> nil
" ".presence   #=> nil

これで何が嬉しいのかっていうと、こういうのをすっきり書けるんですよね。

# こういうのが…
name = params[:name].present? ? params[:name] : '名無し'

# presenceを使うとこうなるよ!!
name = params[:name].presence || '名無し'

Object#try メソッド

もう一つは Object#try メソッドです。これは ActiveSupport 2.3 から導入されました。
参考:http://guides.rubyonrails.org/2_3_release_notes.html

これは、user.name としたいときに user.try(:name) みたいにして使います。

というのも、実は user.name としたときに user が nil の場合があるじゃないですか。そういうときには nil.name となり NoMethodError になってしまうのでチェックが必要なわけですが、Object#try メソッドを使えばすっきり書くことができます。

# こういうのが…
user ? user.name : '名無し'

# tryメソッドを使うとこうなるよ!!
user.try(:name) || '名無し'

これ、実は単なる Object#send メソッドの alias で、加えて NilClass#try メソッドが定義されてます。たったこれだけですが意外と便利なんですよ。

class NilClass
  def try(*args)
    nil
  end
end

ということで、Object#presence メソッドと Object#try メソッドでした。よく似てるけど、値の有無をチェックするときは Object#presence メソッドを、メソッド呼び出しでは Object#try メソッドを使うって感じでコードをすっきりさせましょう〜 (*゚∀゚)
このエントリーをはてなブックマークに追加