0
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?

More than 1 year has passed since last update.

presenceメソッドってもうちょっとなんとかならないのかな

Last updated at Posted at 2021-03-27

railsのpresenceメソッドって

hoge = nil
fuga = hoge.presence || "empty"

って感じで||がつくオプショナルな形なんだから

presence_or { value_in_blank }

みたいに||もラップしたメソッド化されていれば嬉しいな

実際は

hoge = nil
fuga = hoge || "empty"

の書き方でもやってること同じだけど、hogeがnullableな場合を考慮してpresenceの記法が生まれたと思っている(hoge.present? ? hoge : "empty"が冗長だから)。
だったらnilの対処時に多くの場合で||でデフォルト値を入れるんだから、考慮してほしかったな。

一応例外があるけど

hoge = ""

fuga = hoge.presence || "empty" # "empty"
fuga = hoge || "empty" # ""

どういう経緯で今の形式になっているかも知らないし調べるのも面倒だからPRなんて投げないけど

追記

presence_orをデフォルト値が引数になる形で関数化した場合、引数が評価されてしまうとコメントいただきました。
確かにそのとおりで、デフォルト値セットが必要ないときにデフォルト値が評価されてしまいます。デフォルト値が関数の返り値でその関数に副作用があったら、意図せず副作用が発生するので、遅延評価されるブロックの形に修正しました

def hoge_something
  # userがあろうとなかろうと、login_and_return_userは実行され、userがある場合に不要な副作用が発生する
  login_user = user.presence_or(login_and_return_user) 
  ...
end

def hoge_something
  # userがある場合後者は評価されず関数も実行されない
  login_user = user.presence || login_and_return_user
  ...
end

def login_and_return_user
  user = login
  login_count_increment # 副作用がある操作
  user
end
0
0
2

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
0
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?