Object#presence と Object#try という便利なメソッドがあることをご存知ですか?この2つのメソッドはとっても便利なのでちょっと紹介してみます。
これは以下のような定義となっています。
present? メソッドというのはみんな大好き blank? の反対のメソッド (!blank?) です。
つまり、nil, false, [](空配列), {}(空ハッシュ), ""(空文字列), " "(半角スペースだけの文字列)であれば false、それ以外であれば true になります(blank? って半角スペースだけの文字列を true と判定するの知ってました?)。
で、この presence メソッドというのは present? メソッドで評価した結果が true であれば self を、無ければ nil を返します。こんな感じ。
これで何が嬉しいのかっていうと、こういうのをすっきり書けるんですよね。
もう一つは 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 メソッドを使えばすっきり書くことができます。
これ、実は単なる Object#send メソッドの alias で、加えて NilClass#try メソッドが定義されてます。たったこれだけですが意外と便利なんですよ。
ということで、Object#presence メソッドと Object#try メソッドでした。よく似てるけど、値の有無をチェックするときは Object#presence メソッドを、メソッド呼び出しでは Object#try メソッドを使うって感じでコードをすっきりさせましょう〜 (*゚∀゚)
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 メソッドを使うって感じでコードをすっきりさせましょう〜 (*゚∀゚)