【问题标题】:Passing a default parameter to a Rails 3 route makes it fail to match the route in the controller test将默认参数传递给 Rails 3 路由使其无法匹配控制器测试中的路由
【发布时间】:2017-06-14 22:27:44
【问题描述】:

我正在为非营利组织升级一个旧应用程序,但我在 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 的漫长道路的开始;)

【问题讨论】:

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


    【解决方案1】:

    你试过default_url_options。我想它可能会对你有所帮助。

    class AppplicationController < ActionController::Base
      # ...
    
      protected
    
      def default_url_options
        { page_slug: 'tribes', language_id: 3, section_id: 4 }
      end
    end
    

    【讨论】:

    • 您好,感谢您的回复。不幸的是,这对我们在这个应用程序中不起作用。我上面给出的例子是简化的。实际上,有多个使用不同的 I18n'ed 路径名和不同的语言 ID 生成的路由,所以这些默认值并不是可以修复的。在生产中,它们需要通过被命中的路径进行设置,并传递给控制器​​。
    • { page_slug: params[:page_slug], language_id: params[:language_id], section_id: params[:section_id] }怎么样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2016-05-16
    • 2017-01-12
    相关资源
    最近更新 更多