У меня есть приложение Rails 3.2.13, в котором я изначально использовал гем-фильтр маршрутизации для I18n. Я планирую переписать его на Rails 4. Я удалил гем, так как нет доступной рабочей версии Rails 4, и я не смог заставить работать бета-версию. Мне удалось настроить маршрутизацию для большинства приложений. Единственная проблема, с которой я сталкиваюсь, связана с моими пользовательскими страницами ошибок.
Я создал пользовательские страницы ошибок, когда использовал гем-фильтр маршрутизации. Мне нужна помощь в том, как настроить маршруты для пользовательских страниц ошибок.
Вот как у меня есть конфигурация в 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
Вот что у меня было в моем файле маршрутов, когда я использовал гем маршрутизации-фильтра.
match "/404", to: 'errors#error_404'
match "/500", to: 'errors#error_500'
Теперь эти операторы находятся в операторе scope "/:locale". Если я наберу маршрут, который должен появиться при обнаружении ошибок, отобразится правильная страница. Например, в процессе разработки, если я отображаю 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 в error_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
ОБНОВЛЕНИЕ 21.10.2013 10:00 CDT GMT-5
Я также пробовал следующее внутри оператора области действия и снаружи, но все равно получаю ту же ошибку. Я также использовал операторы соответствия без предложения локали, но получаю ту же ошибку.
match "/404", to: redirect('/:locale/error_404'), locale: I18n.locale
match "/500", to: redirect('/:locale/error_500'), locale: I18n.locale
Как установить локаль при возникновении ошибок? Я искал сообщения или примеры, где люди используют пользовательские страницы ошибок вместе с I18n, но пока ничего не нашел.
Любая помощь будет оценена по достоинству.