今回はRailsの便利なメソッドであるpresenceメソッドを紹介します!
基本機能
レシーバーを返し、レシーバーが存在しない場合にはnilを返します。
以下基本的な機能です。
foo = "私はFooです"
foo.presence || "fooは空だよ!"
=> "私はFooです"
foo = ""
foo.presence
=> nil
foo.presence || "fooは空だよ!"
=> "fooは空だよ!"
"".presence || nil.presence || [].presence || {}.presence || "全部空"
=> "全部空"
つまりpresenceメソッドを知らない人が使いがちな、
object.present? ? object : nilと同等のメソッドということです。
ソースコードはこちらです
def presence
self if present?
end
内部的にはpresent?が使われており、present?の判定結果で返り値が変わります。
- trueの場合はレシーバー
- falseの場合は何も返さない(つまりnil)
リファクタリングでの使い方
次にpresenceメソッドを使ったリファクタリングをしていきます。
present?を使った後置ifの例です。
state > country > ‘US’といった優先順位で存在している値をregionに代入しています。
まずこちらが冗長なコードの例
state = params[:state] if params[:state].present?
country = params[:country] if params[:country].present?
region = state || country || 'US'
presenceメソッドを使うと、このコードを以下のようにリファクタリングできます。
region = params[:state].presence || params[:country].presence || 'US'
とてもすっきりしました。
else ifの例も見てみましょう。まず冗長なコード
if nickname.present?
nickname
elsif given_name.present?
given_name
else
email.split('@').first
end
そして次にpresenceメソッドを使ったコード
nickname.presence || given_name.presence || email.split('@').first
7行から1行に減らせたのでとても気持ちいいですね
まとめ
今回はpresenceメソッドについて解説していきました。
present?の周辺はpresenceでリファクタリングできるシーンが多そうなので注意していきたいですね
他の便利な使い方、気づいたこと等あったら追記していきます。
引用資料・参考資料
Object