我的任务是创建与我们的应用程序一致的自定义错误页面。我发现https://wearestac.com/blog/dynamic-error-pages-in-rails完全正常。我没有收到任何路由错误,并且手动测试显示每个页面都正确呈现。
但是,在为用于将路由委派给视图的控制器创建控制器规范时,我遇到了一个问题。我的观看次数为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
config / routes.rb(只有相关路线,我们的完整路线文件是巨大的)
%w(404 422 500).each do |code|
get code, to: "errors#show", code: code, as: 'error_' + code
end
config / application.rb(只有相关的行,其他一切都是标准的):
config.exceptions_app = self.routes
我尝试过扩展路由,以便明确定义每个路由,以及恢复到链接中的第一个非DRY表单。我也尝试将redirect_to
来电更改为render_template
来电,但没效果。
我已经抓了好几天希望弄清楚但是我没有运气。同样,这条路线在开发过程中运行得非常好,但是当我尝试测试这些路线在rspec中工作时,它无法找到任何路线。
除状态代码外,文件中每个规范的错误消息都相同。任何帮助将不胜感激!
答案 0 :(得分:0)
尝试添加:id param 以获取方法。显示动作路径期望a:id param(show action for url的url:id param实际上是索引动作url)。
get :show, params: { id: 1, code: '422' }