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

如何强制Rails考虑像google.com (例如/some_action/google.com )这样的值中的一个点的param一个param而不是"id" => "google", "format"=> "com"

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

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

 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 4中,我使用了:

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

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

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

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

在Rails 4.1中测试

当我们删除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

我们对params有一些限制。

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

编辑:我们使用rails 5