Rails: Как предотвратить конфликты маршрутизации со статическими и динамическими страницами? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть следующий маршрут:

Rails.application.routes.draw do
  get '/:id', to: 'foo#bar', constraints: { id:  /\d+/ }
end

/ 1 загружает мою запись с идентификатором # 1. Проблема в том, что мой маршрут конфликтует со статическими страницами Rails по умолчанию (404, 500 и т. Д.).

Как сделать так, чтобы страницы статических ошибок работали с моими динамическими маршрутами?

Если это возможно, я не возражаю переместить мои статические страницы на маршрут, такой как, например, / errors / 404 .

РЕДАКТИРОВАТЬ 1 :

Повторное открытие класса ActionDispatch :: ShowExceptions и изменение закрытого метода render_exception - чрезвычайно хакерское решение:

конфиг / application.rb:

require_relative 'boot'

require 'rails/all'

Bundler.require(*Rails.groups)

module MyApp
  class Application < Rails::Application
    config.load_defaults 5.2
    config.exceptions_app = self.routes
  end
end

module ActionDispatch
  class ShowExceptions
    private
      def render_exception(request, exception)
        backtrace_cleaner = request.get_header "action_dispatch.backtrace_cleaner"
        wrapper = ExceptionWrapper.new(backtrace_cleaner, exception)
        status  = wrapper.status_code
        request.set_header "action_dispatch.exception", wrapper.exception
        request.set_header "action_dispatch.original_path", request.path_info
        request.path_info = "/errors/#{status}"
        response = @exceptions_app.call(request.env)
        response[1]["X-Cascade"] == "pass" ? pass_response(status) : response
      rescue Exception => failsafe_error
        $stderr.puts "Error during failsafe response: #{failsafe_error}\n  #{failsafe_error.backtrace * "\n  "}"
        FAILSAFE_RESPONSE
      end
  end
end

Я изменил request.path_info = "/#{status}" на request.path_info = "/errors/#{status}".

Мне не нравится это решение.

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете изменить каталог, который отображает исключения.Вам нужно будет изменить некоторую конфигурацию, так что, например, вы можете поместить следующее в config/application.rb в вашем Application классе:

config.exceptions_app = ActionDispatch::PublicExceptions.new(Rails.public_path.join('errors'))

Затем переместите эти статические 404.html и 500.html из public недавно созданному public/errors реж.

...