Нужен маршрут Rails с возможным периодом в: id, но также сохраняйте необязательный формат:
У меня есть маршрут Rails, который содержит символы тикета в виде: id
-
feeds/AMZN
вернет страницу для Amazon
-
feeds/AMZN.csv
вернет CSV-представление тех же данных.
Но мне также нужно размещать такие акции, как VIA.B(Viacom), чтобы оба этих маршрута работали:
feeds/VIA.B (html)
feeds/VIA.B.csv (csv)
Возможно ли это? Как настроить маршрутизацию?
Ответы
Ответ 1
Я столкнулся с этим, исправляя API RubyGems недавно (попытка доступа к flickr.rb
с помощью API (/api/v1/gems/flickr.rb.json
) не работала).
Трюк состоял в том, чтобы предоставить маршрут регулярному выражению для обработки параметра :id
, а затем указать допустимый :format
. Имейте в виду, что regexp :id
должен быть "ленивым" (должен заканчиваться вопросительным знаком), иначе он будет есть .csv
и предположить, что он является частью идентификатора. Следующий пример позволит форматам JSON, CSV, XML и YAML для идентификатора с периодом в нем:
resources :feeds, :id => /[A-Za-z0-9\.]+?/, :format => /json|csv|xml|yaml/
Ответ 2
Старый вопрос, но я нашел гораздо более простой способ работы с вложенными маршрутами (я на Rails 3.2.4). Этот способ позволяет всем символам (включая точку) в отличие от принятого ответа, который позволяет указать разрешенные символы.
resources :feeds, :id => /([^\/])+?/
Заметьте, что я нашел несколько других предложений (например, здесь: http://coding-journal.com/rails-3-routing-parameters-with-dots/):
resources :feeds, :id => /.*/
но по какой-то причине это не сработало для меня с вложенными маршрутами.
Ответ 3
Я столкнулся с этим также, но в обратном направлении. (url_for()
производит "Нет совпадений маршрута" только для идентификаторов с. в них.)
Я использую match
вместо resources
, чтобы разрешить некоторые перехватывания имени. Если вы делаете то же самое, это выглядит так:
match "feeds/:id" => "stocks#feed", :constraints => {:id => /[\w.]+?/, :format => /html|csv/}