カクカクしかじか

技術的なアレコレ

Railsの部分テンプレート(partial)内でローカル変数が存在するか判定する方法

概要

複数のメールテンプレート内で読み込まれる部分テンプレート(partial)の内部に、一部のテンプレートから呼ばれる時だけ locals: { requested_date: @requested_date } のように渡されるローカル変数を定義すると、別の箇所ではその値を渡さないで呼び出されて例外が発生してしまう事案に遭遇しました。

partial内部に値が渡って来なくても例外が発生しないようにぼっち演算子的な動きが出来るものがないか調べたところ defined? というメソッドで解決出来ることがわかったので、本エントリーはその個人メモになります。

使用例

呼び出す側

<%= render(partial: 'shared/customer_information', locals: { requested_date: @requested_date, requested_time: @requested_time }) -%>

partial側

defined? を使わない場合は値が渡って来ないと例外が発生します🔥

<% if defined?(requested_date) || defined?(requested_time) %>
<tr>
  <th style="width:30%; font-weight: bold;"><%= t('mail.requestedDate') %></th>
    <td style="width:70%;"><%= requested_date %></td>
  </tr>
  <tr>
    <th style="width:30%; font-weight: bold;"><%= t('mail.requestedTime') %></th>
  <td style="width:70%;"><%= requested_time %></td>
</tr>
<% end %>

参考

https://qiita.com/shinichinomura/items/1921027fc28279ce54e0