Подтвердить что ты не робот

Нужен маршрут Rails с возможным периодом в: id, но также сохраняйте необязательный формат:

У меня есть маршрут Rails, который содержит символы тикета в виде: id

  • feeds/AMZN вернет страницу для Amazon
  • feeds/AMZN.csv вернет CSV-представление тех же данных.

Но мне также нужно размещать такие акции, как VIA.B(Viacom), чтобы оба этих маршрута работали:

feeds/VIA.B (html)
feeds/VIA.B.csv (csv)

Возможно ли это? Как настроить маршрутизацию?

4b9b3361

Ответ 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/}