2017-02-17 5 views
0

J'ai été chargé de créer des pages d'erreur personnalisées qui correspondent à notre application. J'ai trouvé https://wearestac.com/blog/dynamic-error-pages-in-rails qui fonctionne parfaitement bien. Je n'obtiens pas d'erreurs de routage et je vérifie manuellement que chaque page s'affiche correctement.UrlGenerationError dans le test rspec

Toutefois, lors de la création de spécifications de contrôleur pour le contrôleur utilisé pour déléguer les routes aux vues, je rencontre un problème. Mes vues sont nommées 404.html.erb, 500.html.erb, 422.html.erb. Ils se trouvent au app/views. Mon code est presque exactement la même chose que ce qui est indiqué dans le lien ci-dessus, mais pour la postérité et la clarté, le code correspondant est illustré ci-dessous, ainsi que le message d'erreur est affiché ci-dessous:

Message d'erreur: ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"errors", :params=>{:code=>"404"}}

app/controllers/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 

spec/régulateurs/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 

config/itinéraire s.rb (seule la voie pertinente, notre dossier complet routes est gigantesque)

%w(404 422 500).each do |code| 
    get code, to: "errors#show", code: code, as: 'error_' + code 
end 

config/application.rb (seule la ligne concernée, tout le reste est standard):

config.exceptions_app = self.routes 

J'ai essayé étendre les routes afin que chacune d'elles soit explicitement définie, et revenir au premier formulaire non-DRY dans le lien. J'ai également essayé de changer l'appel redirect_to à un appel render_template, sans effet.

Je me suis gratté la tête pendant des jours dans l'espoir de comprendre mais je n'ai pas eu de chance. Encore une fois, la route fonctionne parfaitement bien dans le développement, mais quand j'essaie de tester que ces routes fonctionnent dans rspec, elle ne peut pas trouver de route.

Le message d'erreur est le même pour chaque spécification du fichier, à l'exception du code d'état. Toute aide serait appréciée!

Répondre

0

Essayez de ajoutez: id param pour obtenir la méthode. Afficher la route d'action attend un: id param (url pour show show sans: id param est en fait une action d'index url).

get :show, params: { id: 1, code: '422' }