Как заставить Rails рассматривать параметр с точкой в значении, например google.com
(например, /some_action/google.com
), один параметр, а не "id" => "google", "format"=> "com"
?
Значение параметра должно быть "id" => "google.com"
Как заставить Rails рассматривать параметр с точкой в значении, например google.com
(например, /some_action/google.com
), один параметр, а не "id" => "google", "format"=> "com"
?
Значение параметра должно быть "id" => "google.com"
По умолчанию динамические сегменты не принимают точки - это потому, что точка используется как разделитель для отформатированных маршрутов. Однако вы можете добавить некоторые требования к регулярному выражению к параметрам маршрута. Здесь вы хотите разрешить точки в параметрах.
match 'some_action/:id' => 'controller#action', :constraints => { :id => /[0-z\.]+/ }
И в рельсах 2.3:
map.connect 'some_action/:id', :controller => 'controller', :action => 'action', :requirements => { :id => /[0-z\.]+/ }
В 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
Мы охраняли это с некоторым ограничением по параметрам.
put '/api/app/v1/foo/:version',
constraints: { version: /([0-9]+)\.([0-9]+)\.([0-9]+)/ },
to: redirect('/api/v1/foo/%{version}')
Изменить: мы используем рельсы 5