Мне было поручено создавать собственные страницы ошибок, которые соответствуют нашему приложению. Я нашел https://wearestac.com/blog/dynamic-error-pages-in-rails, который отлично работает. Я не получаю ошибок маршрутизации, и ручное тестирование показывает, что каждая страница отображается правильно.UrlGenerationError in rspec test
Однако при создании спецификаций контроллера для контроллера, используемого для делегирования маршрутов представлениям, у меня возникает проблема. Мои взгляды называются 404.html.erb
, 500.html.erb
, 422.html.erb
. Они расположены в app/views
. Мой код почти точно так же, как то, что указан в приведенной выше ссылке, однако для потомства и ясности, соответствующий код показан ниже, а также показано ниже сообщение об ошибке: сообщение
Ошибки: ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"errors", :params=>{:code=>"404"}}
приложение/контроллеры/errors_controller.rb:
# frozen_string_literal: true
class ErrorsController < ApplicationController
def show
render status_code.to_s, status: status_code
end
protected
# get status code from params, default 500 in cases where no error code
def status_code
params[:code] || 500
end
end
спецификации/контроллеры/errors_controller_spec.rb:
require 'rails_helper'
describe ErrorsController, type: :controller do
describe '#show' do
it 'renders the 404 error page when it receives a 404 status code' do
get :show, params: { code: '404' }
# ive also tried changing the param passed to redirect_to to error_404 to no effect
expect(response).to redirect_to(error_404_path)
end
it 'renders the 422 error page when it receives a 422 status code' do
get :show, params: { code: '422' }
expect(response).to redirect_to(error_422_path)
end
it 'renders the 500 error page when it receives a 500 status code' do
get :show, params: { code: '500' }
expect(response).to redirect_to(error_500_path)
end
end
end
конфигурации/маршрута s.rb (только соответствующий маршрут, наши полные маршруты файл гигантский)
%w(404 422 500).each do |code|
get code, to: "errors#show", code: code, as: 'error_' + code
end
конфигурации/application.rb (только соответствующая линия, все остальное стандартно):
config.exceptions_app = self.routes
Я попытался расширяя маршруты, чтобы каждый из них был явно определен, а также возвращался к первой не суточной форме в ссылке. Я также попытался сменить вызов redirect_to
на звонок render_template
, который не имеет никакого эффекта.
Я поцарапал голову в течение нескольких дней, надеясь понять это, но мне не повезло. Опять же, маршрут работает отлично в разработке, но когда я пытаюсь проверить, что эти маршруты работают в rspec, он не может найти никакого маршрута.
Сообщение об ошибке одно и то же для каждой спецификации в файле, кроме кода состояния. Любая помощь будет оценена!