Rails 3.2.13 アプリケーションでは、もともと I18n 用に routing-filter gem を使用していました。Rails 4 で書き直す予定です。Rails 4 の製品版が利用できず、ベータ版を動作させることができなかったため、gem を削除しました。ほとんどのアプリケーションのルーティングを設定することに成功しました。私が抱えている唯一の問題は、カスタム エラー ページにあります。
routing-filter gem を使用していたときに、カスタム エラー ページを作成しました。カスタム エラー ページのルートを設定する方法についてサポートが必要です。
config/application.rb で設定を行う方法は次のとおりです
config.exceptions_app = self.routes
これが私がapplication_controller.rbに持っているものです
before_filter :set_locale
def default_url_options(options={})
{ :locale => I18n.locale }
end
private
def set_locale
I18n.locale = (params[:locale] if params[:locale].present?) || cookies[:locale] || 'en'
cookies[:locale] = I18n.locale if cookies[:locale] != I18n.locale.to_s
end
これは、routing-filter gem を使用していたときのルート ファイルの内容です。
match "/404", to: 'errors#error_404'
match "/500", to: 'errors#error_500'
現在、これらのステートメントはスコープ "/:locale" doステートメント内にあります。エラーが見つかったときに表示されるルートを入力すると、正しいページが表示されます。たとえば、開発中の場合、フランス語のカスタム エラー ページが適切にhttp://localhost:3000/fr/404
表示http://localhost:3000/fr/500
されます。/en がある場合、英語のカスタム エラー ページが表示されます。
エラーが発生すると、ロケールがエラー番号に割り当てられます。適切なエラー ページを表示する代わりに、もちろん存在しないエラー番号の翻訳を見つけようとするランディング ページが表示されます。ロケールがエラー番号に設定される方法がわかりません。application_controller.rb にあるもので、I18n.locale に設定する必要があると思います。また、config/routes.rb のスコープ ステートメントを以下のコードに変更してみました。どちらも同じ結果になりました。
scope "/:locale", defaults: { :locale => I18n.locale.to_s } do
scope "/:locale", defaults: { :locale => I18n.locale } do
これが機能しなくなったとき、 respond_toステートメントを errors_controller.rbに追加しました。ただし、それでも同じエラーが発生します。
def error_404
@page_title = t(:error_title_404)
respond_to do |format|
format.html { render status: 404 }
format.any { render text: "#{t :error_title_404_alt}", status: 404 }
end
end
def error_500
@page_title = t(:error_title_500)
respond_to do |format|
format.html { render status: 500 }
format.any { render text: "#{t :error_title_500_alt}", status: 500 }
end
end
更新 2013 年 10 月 21 日午前 10 時 CDT GMT-5
スコープステートメント内と外で次のことも試しましたが、それでも同じエラーが発生します。locale 句なしで match ステートメントも使用しましたが、同じエラーが発生します。
match "/404", to: redirect('/:locale/error_404'), locale: I18n.locale
match "/500", to: redirect('/:locale/error_500'), locale: I18n.locale
エラーが発生したときにロケールを設定するにはどうすればよいですか? I18n と共にカスタム エラー ページを使用している投稿や例を探していますが、これまでのところ見つかりませんでした。
どんな助けでも大歓迎です。