Наличие точки в id маршрутов рельсов - PullRequest
9 голосов
/ 02 августа 2011

Я работаю над Rails 2.3.11. Если у меня есть URL-адрес типа http://www.abc.com/users/e.f.json, я ожидаю, что идентификатор будет «e.f», а ожидаемый формат - «json». Может кто-нибудь, пожалуйста, предложите способ сделать это. Спасибо!

Ответы [ 2 ]

10 голосов
/ 27 августа 2011

Из-за соглашения о формате: Rails будет анализировать все параметры без каких-либо точек.Вы можете иметь параметры маршрута с точками , если хотите:

# You can change the regex to more restrictive patterns
map.connect 'users/:id', :controller => 'users', :action => 'show', :id => /.*/

Но так как подстановочные знаки регулярного выражения '*' и '+' являются жадными, он игнорирует (.: Формат)param полностью.

Теперь, если вам абсолютно необходимо иметь точки в имени пользователя, существует псевдо-обходной путь, который может помочь вам:

map.connect 'users/:id:format', :controller => 'users', :action => 'show', :requirements => { :format => /\.[^.]+/, :id => /.*/ }
map.connect 'users/:id', :controller => 'users', :action => 'show'

Недостатком является то, что вы должны включитьточка в регулярном выражении: format, в противном случае она будет перехвачена выражением имени пользователя.Затем вы должны обработать точечный формат (например, .json) в вашем контроллере.

2 голосов
/ 03 февраля 2016

Вот решение, похожее на решение andersonvom, но оно объединяет все это в одно правило (и использует некоторые современные сокращения маршрутизации Rails).

map.connect 'users/:id(.:format)', to: 'users#show', id: /.*?/, format: /[^.]+/

(обратите внимание на . перед :format)

Хитрость в том, чтобы добавить необязательный формат (.:format) и сделать регулярное выражение id нежадным, чтобы формат распознавался. Важно сохранить его в одном правиле, если вы хотите дать маршруту имя, чтобы вы могли использовать его для переадресаций, ссылок и т. Д. В формате, не зависящем от формата.

...