はじめに
ActiveSupportの拡張機能である presence
メソッドについて調べた内容をまとめます。
presence
メソッドとは
- RailsのActiveSupportのメソッド
- オブジェクトが存在すればそのオブジェクトを返し、存在しなければnilを返す
構文
object.presence
# 下記と同じ
object.present? ? object : nil
- ActiveSupportで下記のように実装されている
def presence
self if present?
end
使い方
-
present?
を使った例
nickname = params[:nickname] if params[:nickname].present?
first_name = params[:first_name] if params[:first_name].present?
avatar_name = nickname || country || "Taro"
-
presence
で下記のようにリファクタリングできる
avatar_name = params[:nickname].presence || params[:first_name].presence || "Taro"
補足
-
&.
との比較-
presence
メソッドを空文字に対して実行するとnilを返す=present?
メソッドでfalseになる空白文字、空の配列、空のハッシュ、false、nilに対して実行するとnilが返る
-
presence | &. | |
---|---|---|
nilに対して実行した返り値 | nil | nil |
空文字に対して実行した返り値 | nil | 空文字 |
nil&.name
=> nil
nil.presence
=> nil
user.name
=> " " # 空文字が保存されている場合
user&.name
=> " "
user.name.presence
=> nil
user&.name || "名前が登録されていません"
=> " "
user.name.presence || "名前が登録されていません"
=> "名前が登録されていません"
- DBにデータがない場合
irb(main):001:0> User.where(id: 2)
=> #<ActiveRecord::Relation []>
irb(main):002:0> User.where(id: 2).presence || "idが2のユーザーは登録されていません"
=> "idが2のユーザーは登録されていません"
おわりに
リファクタリングに重宝しそうです。空白文字をnilで返す点で&.
try!
よりも使い勝手が良いと思いました。
参考