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!