なんじゃくにっき

プログラミングの話題中心。

Railsのviewで部分テンプレート(partial template)内でエラーが起きた時に画面全体がエラーになるのを防ぐ(2)

概要

Railsのviewで部分テンプレート内でエラーが起きたときに画面全体がエラーになるのを防ぎたい、の第二段。

昨日の続き。

Railsのviewで部分テンプレート(partial template)内でエラーが起きた時に画面全体がエラーになるのを防ぐ(1) - なんじゃくにっき

昨日のやり方だと、部分テンプレート内でエラーが起きた時に途中まで描画されて閉じタグない状態などができてしまいます。

ということで部分テンプレート内でエラーが起きたときは部分テンプレート全部表示されなくする版も作ってみました。

Helper

app/helpers/application_helper.rb

module ApplicationHelper

  def error_boundary
    content = capture { yield }
    raw content
  rescue => ex
    puts ex
    # TODO: 適宜エラートラッキングツールに通知するなり、ログを吐くなりする

    # 最後に評価したものが画面に出力されないようにnilを返す
    nil
  end
end

captureを使うのがミソ。

rawをあまり使いたくなかったんですが、もうちょっと上手く行く方法を思いつかず。

(escapeがおかしくなってないか等の動作確認は各自願います)

View

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>

    <header>
      <%= error_boundary do %>
        <div>
          ヘッダ?
          <% 1 / 0 %>
          ヘッダ!
        </div>
      <% end %>
    </header>

    <main>
      <%= yield %>
    </main>
  </body>
</html>

error_boundaryが文字列を返すようになるので <%= %>で出力する必要があります。