ruby-on-rails - 一条匹配的路线会覆盖另一条路线,但不应该

标签 ruby-on-rails ruby testing routes

在routes.rb中,我有:

[some routes]

match '/me' => "scores#all_athlete_scores", :constraints => LoggedInChecker
devise_scope :user do
  match '/me' => "devise/sessions#new"
end

match '/scores/athlete/:id', :to =>"scores#all_athlete_scores", :as => "all_athlete_scores"

[some more routes]

如果用户已登录,LoggedInChecker 返回 true,如果未登录,则返回 false。如果为 false,第二条路由会选择它并将用户发送到登录页面。

在scores_controller_test.rb中,我有:

def test_get_all_athlete_scores
   [set up]
   get :all_athlete_scores, :id => @user
end

奇怪的是,scores_controller_test 中的 request.filtered_pa​​rameters[:full_path] 是/[email protected] ,而不是/scores/athlete/:id'。

如果我将routes.rb更改为:

[some routes]

match '/scores/athlete/:id', :to =>"scores#all_athlete_scores", :as => "all_athlete_scores"

match '/me' => "scores#all_athlete_scores", :constraints => LoggedInChecker
devise_scope :user do
  match '/me' => "devise/sessions#new"
end

[some more routes]

测试工作正常,request.filtered_pa​​rameters[:full_path] =/scores/athlete/:id。

对此完全感到困惑 - 当对 all_athlete_scores 进行 GET 时,/me 不应该匹配。

有什么想法吗?

最佳答案

卡里姆,

我认为令人困惑的是,您有一个方法以及一个命名路线“all_athlete_scores”。

get :all_athlete_scores, :id => @user

调用方法 all_athlete_scores 而不是您所期望的命名路线。

可能应该只在此测试中测试该方法的功能,并将路由测试留给另一个测试。

希望有帮助!

关于ruby-on-rails - 一条匹配的路线会覆盖另一条路线,但不应该,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9934787/

相关文章:

ruby-on-rails - Time gt 查询不适用于 mongoid 和 ruby​​ on rails

ruby - 为什么这个异常没有被救援 block 捕获?

asp.net - Ruby 的 SignalR 客户端

ruby-on-rails - ruby gem devise 无法生成初始化程序

ruby-on-rails - 使用多个数据库测试 Rails 应用程序

ruby-on-rails - 在 Ruby 中创建多个相同的方法

ruby-on-rails - 如何处理 RSpec 和 Rails 中的模拟嵌套资源?

ruby-on-rails-3 - 为什么我的测试不适用于此表单?

testing - 我为什么要写测试?

javascript - 重新布线和导入其他模块