Как перенаправить на страницу 404 в rout.rb?

Как я могу перенаправить неверный URL-адрес на страницу 404 в routs.rb? Сейчас я использую 2 примера кода:

# example 1
match "/go/(*url)", to: redirect { |params, request| Addressable::URI.heuristic_parse(params[:url]).to_s }, as: :redirect, format: false

# example 2
match "/go/(*url)", to: redirect { |params, request| Addressable::URI.heuristic_parse(URI.encode(params[:url])).to_s }, as: :redirect, format: false

Но когда я пытаюсь использовать русские слова в параметре 'url', в первом примере я получаю 500 страниц (неверный URI), во втором - я получаю перенаправление на stage.example.xn -org-yedaaa1fbbb/

Спасибо

2 ответа

Решение

Если вам нужны нестандартные страницы ошибок, вам лучше всего посмотреть ответ, который я написал несколько недель назад.


Вам нужно несколько важных элементов для создания пользовательских маршрутов ошибок:

-> Добавить пользовательский обработчик ошибок в application.rb :

# File: config/application.rb
config.exceptions_app = self.routes

-> Создать /404 маршруты в вашем routes.rb :

# File: config/routes.rb
if Rails.env.production?
   get '404', :to => 'application#page_not_found'
end

-> Добавить actions к контроллеру приложений для обработки этих маршрутов

# File: app/controllers/application_controller.rb
def page_not_found
    respond_to do |format|
      format.html { render template: 'errors/not_found_error', layout: 'layouts/application', status: 404 }
      format.all  { render nothing: true, status: 404 }
    end
  end

Это, очевидно, относительно простой, но, надеюсь, это даст вам больше идей о том, что вы можете сделать

Самое простое, что нужно сделать, - убедиться, что ваши маршруты не соответствуют плохим URL. По умолчанию Rails возвращает 404 для несуществующих маршрутов.

Если вы не можете сделать это, страница 404 по умолчанию живет в /404 так что вы можете перенаправить на это место. Однако здесь следует иметь в виду, что этот тип перенаправления будет выполнять перманентное перенаправление 301 вместо 302. Возможно, это не то поведение, которое вам нужно. Для этого вы можете сделать следующее:

match "/go/(*url)", to: redirect('/404')

Вместо этого я бы порекомендовал установить в вашем действии фильтр до, который вместо этого вызывает исключение не найден. Я не совсем уверен, находится ли это исключение в том же месте в Rails 4, но в Rails 3.2 я сейчас использую:

raise ActionController::RoutingError.new('Not Found')

Затем вы можете выполнить любую обработку и проверку URL в контроллере (если требуется сложная проверка формата URL).

Другие вопросы по тегам