Ruby on Rails 3.2.13 — Получение ошибки с пользовательскими страницами ошибок с использованием I18n

У меня есть приложение 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, но пока ничего не нашел.

Любая помощь будет оценена по достоинству.


person Pamela Cook - LightBe Corp    schedule 18.10.2013    source источник


Ответы (1)


Поскольку я не получил никакого ответа на этот вопрос, я решил попытаться создать собственные страницы ошибок, используя I18n в общей папке. Я создал этот пост Rails 4 - хотел бы создавать собственные страницы ошибок в общей папке с помощью I18n. Я смог найти решение, которое хорошо работает и подробно описано в моем посте.

person Pamela Cook - LightBe Corp    schedule 07.11.2013