コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RubyのArrayなどでfirstは空ならnilを返すことがあるので、気をつけて使おう

Railsだけど、自分の体験した辛さを言語化するシリーズ

要約

messages.first.title とかやるとコケるので、ちゃんとこういうことを考慮した作りにして欲しい。

遭遇した事象

Railsのview上に以下のようなコードがあった

<div class="title">
    <div id="notifce_message"><%= @messages.first.title %>』が最初のメッセージタイトルです</div>
</div>

複数あるメッセージの中で最初のメッセージが届いている旨のコードである。だがこの @messsages が 0件の場合は @messages.first の結果が nil になるため nil.title しようとしてエラーになる。

回避の考え方

回避の考え方とはとしては2つある

  1. nilにならないようにする
  2. nilでも大丈夫なようにする

nilにならないようにする

無理やりfirstでとってきてメソッドチェインで解決しようとするからまずいので、ちゃんとそれように変数に詰めるなり、メソッドを用意してあげる。

今回の例の場合はdecorator系のメソッドを用意してあげれば解決する。

def first_message_title
  return "" if @messages.first.nil?
  @messages.frist.title
end
<div class="title">
    <div id="notifce_message"><%= first_message_title %>』が最初のメッセージタイトルです。</div>
</div>

nilでも大丈夫なようにする

messageは1件以上入ることが絶対で、メソッドをつくるほどでもない場合はボッチ演算子で回避することもできる。ただしこれは使い方によってエラーを正しく認識出来ない場合があるのでケースバイケース

<div class="title">
    <div id="notifce_message"><%= @messages.first&.title %>』が最初のメッセージタイトルです</div>
</div>

参考