2017-02-17 2 views
0

Мне было поручено создавать собственные страницы ошибок, которые соответствуют нашему приложению. Я нашел 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, он не может найти никакого маршрута.

Сообщение об ошибке одно и то же для каждой спецификации в файле, кроме кода состояния. Любая помощь будет оценена!

ответ

0

Попробуйте add: id param, чтобы получить метод. Показывать маршрут действия ожидает: id param (url для действия show без: id param на самом деле URL-адрес указателя).

get :show, params: { id: 1, code: '422' } 
Смежные вопросы