🌏

[Rails][i18n] around_action で指定した locale が rescue_from だと効かなくなる

2024/06/17に公開

ドーモ、株式会社ソーシャルPLUS CTO の サトウリョウスケ (@ryosuke_sato) です ✌︎('ω')✌︎

ちょっと珍しい罠にハマったので、備忘録がてらメモしておきます ✍️


Rails ガイドの国際化対応 でも紹介されていますが、こんな感じで locale を設定している Rails アプリケーションが多いと思います:

class ApplicationController < ActionController::Base
  around_action :switch_locale

  def switch_locale(&action)
    locale = params[:locale] || I18n.default_locale
    I18n.with_locale(locale, &action)
  end
end
some.html.erb
<%= t :hello # => "こんにちは。" %>

ところがどっこい、 rescue_from で例外を捕捉して render すると #switch_locale で指定した locale が効かなってしまいます:

rescue_from SomeError do
  render :error
end
error.html.erb
<%= t :hello # => "Hello." %>

どうやら rescue_from で例外を補足すると around_action :switch_locale の block の外に出てしまい、 I18n.with_locale(locale, &action) で変更した locale が元に戻ってしまうようです。

愚直な対応ですが、以下のように rescue_from の内部で再度 locale を設定する必要があります:

rescue_from SomeError do
  locale = params[:locale] || I18n.default_locale
  I18n.with_locale(locale) do
    render :error
  end
end
error.html.erb
<%= t :hello # => "こんにちは。" %>
SocialPLUS Tech Blog

Discussion