🌏
[Rails][i18n] around_action で指定した locale が rescue_from だと効かなくなる
ドーモ、株式会社ソーシャル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 # => "こんにちは。" %>
Discussion