Поддержка URL-адресов типа /similar-to-:product в Ruby on Rails?

StackOverflow https://stackoverflow.com/questions/120751

  •  02-07-2019
  •  | 
  •  

Вопрос

Я пытался использовать маршруты.rb для создания URL-адреса /similar-to-:product (где продукт является динамическим) для моего веб-сайта.Проблема в том, что Routes.rb легко поддерживает URL-адреса типа /:product-similar, но не поддерживает первый, поскольку требует, чтобы перед :product стоял разделитель («/» является разделителем, а «-» — нет).Список разделителей находится в ActionController::Routing::SEPARATORS.

Я не могу добавить «-» в качестве разделителя, потому что :product также может содержать дефис.Каков наилучший способ поддержки такого URL-адреса?

Один из способов, который я успешно опробовал, — не использовать маршруты.rb и поместить логику анализа URL-адресов в сам контроллер, но это не самый чистый способ.

Это было полезно?

Решение

На самом деле вы можете добавить - в качестве разделителя, затем используйте подстановку маршрутов.

map.similar_product '/similar-to-*product', :controller => 'products', :action => 'similar'

затем в ProductsController#similar

@product = Product.find_by_slug params[:product].join('-')

Хотя рефакторинг кажется более приятным, поскольку при таком подходе вам нужно будет специально обрабатывать все фрагменты, которые могут содержать дефисы.

Другие советы

Я бы реорганизовал ваши URL-адреса, чтобы они были просто «похожими на/продукт».

Простое решение — использовать фильтр маршрутизации.Подробности смотрите в README.

С фильтром маршрутизации вы можете получить URL-адрес /similar-to-:product, предварительно обработайте его до /similar-to/:product прежде чем дело дойдет до распознавания маршрутизации.Вы также захотите выполнить постобработку сгенерированных путей обратно из /similar-to/:product к /similat-to-:product.

Я немного запутался, но не могли бы вы добавить «to-» в качестве разделителя?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top