将默认参数传递给Rails 3路由会使其无法与控制器测试中的路由匹配

时间:2017-06-14 22:27:44

标签: ruby-on-rails ruby-on-rails-3 rails-routing

我正在升级一个非营利性的旧应用程序,我在Rails 3.0.20上遇到了一些路由和控制器测试的问题(Rails 2 - > 3是我需要进行的许多升级中的第一个:()

这是我的路线定义:

match "new/tribes" => "news#tribes",
  as: "en_news_tribes",  
  defaults: {
    page_slug: 'tribes',
    language_id: 3,
    section_id: 4
  }

这个想法是,当调用控制器时,参数将包含page_slug,language_id和section_id的默认值

在我的控制器测试(基于TestUnit)中,动作调用如下:

get :tribes, { section_id: 4, language_id: 4, tribe_id: @loc_tribe.tribe.id }

但这会产生此路由异常:

ActionController::RoutingError: No route matches {:section_id=>4, :language_id=>3, :tribe_id=>1, :controller=>"news", :action=>"tribes"}

只有当我指定所有默认参数时,才会找到路线(并且测试通过):

get :tribes, { section_id: 4, language_id: 4, tribe_id: @loc_tribe.tribe.id, page_slug: 'tribes' }

如果我传递的参数与config/routes.rb中指定的默认参数值不匹配,则找不到路线。

即。这不起作用:

get :tribes, { section_id: 4, language_id: 4, tribe_id: @loc_tribe.tribe.id, page_slug: 'Abc123' }

所以看起来这些默认值实际上表现为路由约束?

我希望有人可以提供帮助!我正处于将此应用程序应用于Rails 5的漫长道路的开始;)

1 个答案:

答案 0 :(得分:0)

您是否尝试过default_url_options。我认为这对你有帮助。

class AppplicationController < ActionController::Base
  # ...

  protected

  def default_url_options
    { page_slug: 'tribes', language_id: 3, section_id: 4 }
  end
end