我可以在rails 2.3路由中的下划线后绑定参数吗?

时间:2011-03-24 09:34:18

标签: ruby-on-rails url-routing

为了保持向后兼容性,我们需要将/sitemap_1234000.xml映射到站点地图控制器,并将1234000作为ID传递。我试过了

map.connect '/sitemap_:id.xml', :controller => 'sitemap',
                            :action => 'show'

但是当我做的时候

assert_routing '/sitemap_1234000.xml', :controller => 'sitemap', 
                                       :action => 'show',
                                       :id => "1234000"

我被告知'/sitemap_1234000.xml'没有路由存在。我可以在rails 2.3路由中的下划线后绑定参数吗?

2 个答案:

答案 0 :(得分:0)

您可以使用通配符:

map.connect '/sitemap_(*id).xml, :controller=>'sitemap', :action=>'show'

然后params [:id]应该给你你想要的东西。

未经测试 - 让我知道这是否有效

答案 1 :(得分:0)

在铁轨内部进行了一些挖掘之后,这就是我想出来的:

config/initializers/bound_parameter_after_underscore.rb

module ActionController
  module Routing
    class RouteBuilder
      def initialize_with_bound_parameter_after_underscore
        initialize_without_bound_parameter_after_underscore
        @nonseparator_regexp = /\A([^#{Regexp.escape(separators.join)}:\*]+)/
      end

      alias_method_chain :initialize, :bound_parameter_after_underscore
    end
  end
end

这会阻止冒号和星号出现在静态段中。以前查找静态段的正则表达式占用了所有sitemap_:id;现在它消耗sitemap_并离开:id,然后将其识别为您希望的。