1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】presenceメソッド

Posted at

はじめに

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! よりも使い勝手が良いと思いました。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?