我有这个错误控制器:
class ErrorsController < ApplicationController
def error_404
@not_found_path = params[:not_found]
@return_page = request.referer || root_path
errors_respond 404
end
def error_500
errors_respond 500
end
end
在我的applicaiton_controller.rb
我有
def render_error(status, exception)
errors_respond status
rescue
end
render_error方法在application_helper.rb
- file
def errors_respond(status)
respond_to do |format|
format.html { render :template => "errors/error_#{status}", :layout => 'layouts/application_bootstrap', :status => status }
format.all { render :nothing => true, :status => status }
end
end
在routes.rb
文件的最底部 - 我有
match '/i_really_do_not_exist', to: redirect('/') # WTF? error_controller_specs will fail if this is removed
match '*not_found', to: 'errors#error_404'
上述error_controller_spec.rb
就是这个
require 'spec_helper'
describe ErrorsController do
describe "GET 'error_404'" do
it "returns http status 404" do
get 'error_404'
response.response_code.should == 404
end
end
describe "GET 'error_500'" do
it "returns http status 500" do
get 'error_500'
response.response_code.should == 500
end
end
end
如果我在没有'/i_really_do_not_exist'
路径的情况下运行它们,则会失败并显示
ActionController::RoutingError:
No route matches {:controller=>"errors", :action=>"error_404"}
如果删除/
,情况也是如此。
我可以更改匹配部分和重定向部分,我的规格将通过,但是如果我完全删除它们就会失败。
match '/i_really_do_not_exist' => redirect('/')
生成的路线为:controller#:action
。
有人知道发生了什么事吗?
答案 0 :(得分:0)
我有一个理论。
您可能实际上没有错误路径#error_404。当rspec尝试访问它时,这一行:
match '/i_really_do_not_exist' => redirect('/')
将其重定向到错误控制器和操作。如果没有该行,则会发生RoutingError,因为没有路由。
检查rake routes
的输出,以查看是否存在错误路径#error_404。如果没有,请检查您的路线文件和您的文件名。很容易错误地命名文件error_controller.rb
而不是errors_controller.rb
。
编辑:
我想当你做的时候
get 'error_404'
errors_controller_spec
中的 RSpec尝试获取/errors_controller/error_404
,这不在您的路线中。当然,您实际上并不希望任何人访问该网址,因此在您的路线中没有它是正确的。
我认为你应该做的是有一个反映预期行为的规范:当有人试图访问不存在的东西时,路由到错误#error_404。您可能希望在不同的spec文件中执行此操作,因为它描述了一般行为。参见:
https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs/anonymous-controller