Rails - 带“点”的参数(例如/google.com)

时间:2010-06-01 18:23:59

标签: ruby-on-rails ruby

如何强制Rails考虑一个包含google.com(例如/some_action/google.com)值的点的参数,而不是"id" => "google", "format"=> "com"

参数值应为"id" => "google.com"

4 个答案:

答案 0 :(得分:29)

默认情况下,动态细分不接受点 - 这是因为点用作格式化路线的分隔符。但是,您可以向路由参数添加一些正则表达式要求。在这里,您想要允许参数中的点。

match 'some_action/:id' => 'controller#action', :constraints  => { :id => /[0-z\.]+/ }

在rails 2.3中:

map.connect 'some_action/:id', :controller => 'controller', :action => 'action',  :requirements => { :id => /[0-z\.]+/ } 

Relevent rails guides section

答案 1 :(得分:4)

在Rails 4中我用过:

get 'operation/:p1/:p2', to: 'operation#get', constraints: { p1: /[^\/]+/, p2: /[^\/]+/ }

它允许两个参数中的任何字符(除了' /')

答案 2 :(得分:1)

当与 resources 表示法一起使用时,可以这样做:

resources :post, 
               only: [ :create, :index, :destroy ], 
               constraints: { id: /[0-z\.]+/ }

在Rails 4.1中测试

答案 3 :(得分:0)

当我们移除了api路径的某些部分时,我们遇到了类似的情况。基本上我们从/api/app/v1/*转到/api/v1/*

我们把它放在我们的路线

match '/api/app/v1/*path', to: redirect(path: '/api/v1/%{path}'), via: :all

除了一些以路径参数(包括点)结束的路线外,这一切都很好。例如。 /api/v1/foo/00.00.100.100解析为format,其余参数只有00.00

我们在对这些参数进行了一些约束时保护了它。

put '/api/app/v1/foo/:version', 
    constraints: { version: /([0-9]+)\.([0-9]+)\.([0-9]+)/ },
    to: redirect('/api/v1/foo/%{version}')

编辑:我们使用rails 5