【Rails】presenceメソッドの使い方とリファクタリング例を紹介!【便利メソッド】

Ruby

今回は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

Rails: present?より便利なActiveSupportのpresenceメソッド(翻訳)

タイトルとURLをコピーしました