Поддержка URL-адресов типа /similar-to-:product в Ruby on Rails?
-
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-» в качестве разделителя?