我现在正在写一本关于 Rails 3 的书,过去的我已经写在第 3 章左右,所以当运行特定功能时会生成路由错误。现在,我不像我去写不真实的东西,所以我很确定这在过去发生过一次。
我还没有能够自己复制这个场景,但我非常有信心它是环境文件中被遗忘的设置之一。
要复制此问题:
public/index.html
文件 Gemfile
中的“测试”组中bundle install
rails g cucumber:skeleton
features/creating_projects.feature
这个:
Feature: Creating projects
In order to value
As a role
I want feature
Scenario: title
Given I am on the homepage
当您使用
bundle exec cucumber features/creating_projects.feature
运行此功能时它应该失败并显示“No route matching/”错误,因为您没有定义根路由。然而,我和其他人所看到的是事实并非如此。现在我已经在
test.rb
中设置了一个设置这将显示此异常页面,但我宁愿 Rails 对异常进行硬引发,以便它在 Cucumber 中显示为失败的步骤,就像我很确定以前那样,而不是通过的步骤。有谁知道自去年 5 月以来 Rails 不这样做会发生什么变化?我非常有信心这是
config/environments/test.rb
中的一些设置,但对于我的生活,我无法弄清楚。
最佳答案
在我调查 Rails 源代码后,它似乎是 ActionDispatch::ShowExceptions
负责引发异常的中间件 ActionController::RoutingError
测试环境中缺少。通过运行确认rake middleware
和 rake middleware RAILS_ENV=test
.
您可以在 https://github.com/josh/rack-mount/blob/master/lib/rack/mount/route_set.rb#L152 中看到它回来了 X-Cascade => 'pass'
标题,它是 ActionDispatch::ShowExceptions
捡起它的责任(在 https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/show_exceptions.rb#L52 中)
所以你看到你的测试用例通过的原因是因为 rack-mount
正在返回“未找到”文本,状态为 404。
我会责怪人们并为您解决问题。这是这里的条件:https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L159 .如果设置为 true,错误会被正确翻译,但我们会得到错误页面输出。如果它是假的,那么这个中间件根本不会被加载。坚持,稍等 ...
更新 :要清除前一个块,您在这里遇到了死胡同。如果您正在设置 action_dispatch.show_exceptions
至 false
,您将无法加载该中间件,从而导致来自 rack-mount
的 404 错误被渲染。而如果您正在设置 action_dispatch.show_exceptions
至 true
,该中间件将被加载,但它会挽救错误并为您呈现一个不错的“异常”页面。
关于ruby-on-rails-3 - 提升路线未找到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5022454/