Вам нужен способ различать /businesses/:id
и /businesses/:permalink
.:id
всегда должен быть числовым (если, конечно, вы не используете MongoDB), поэтому, если вы можете заставить :permalink
всегда содержать что-то не числовое, тогда простой :constraints
должен сделать трюк:
match '/businesses/:permalink', :to => 'businesses#show`, :constraints => { :permalink => /.*\D/ }, :as => :business_permalink
/.*\D/
заставляет маршрут совпадать, только если :permalink
содержит хотя бы один нечисловой символ.Вам нужен .*
, потому что регулярные выражения маршрута неявно привязаны в начале.
Если вы используете MongoDB, тогда ваш :id
, вероятно, будет шестнадцатеричным BSON ID, поэтому вы захотите использовать /.*\H/
в качестве ограничения, и вы захотите каким-то образом убедиться, что ваш :permalink
всегда содержит хотя бы один не шестнадцатеричный символ.
Как только все будет готово, вы можете поставить match "/businesses/:permalink"
перед вашим resources :businesses
в routes.rb
и все должно работать нормально.Маршруты проверяются в том же порядке, в котором они отображаются в routes.rb
, поэтому вы хотите, чтобы ваш match
предшествовал вашему resources
.
.