Можно ли создать маршрут типа '~: id' в Rails 2.x? - PullRequest
1 голос
/ 23 июля 2010

Я успешно использовал следующий маршрут в своем приложении Rails 2.x:

map.user ':id', :controller => 'users', :action => 'show'

Это, как мой самый низкий маршрут, правильно ловит такие вещи, как /tsmango и отображает Users#show.

Я сейчас пытаюсь добавить второй, похожий маршрут:

map.post '~:id', :controller => 'posts', :action => 'show'

Поскольку ни моим пользователям, ни моим сообщениям не разрешено содержать ~ и поскольку этот маршрут будет отображаться над моим маршрутом map.user , я предположил, что это правильно перехватит любой вызов, начинающийся с /~, и отобразит мой Posts#show действие. К сожалению, у меня проблемы с тем, чтобы заставить это работать.

Что интересно, этот подобный маршрут работает отлично:

map.post ':id~', :controller => 'posts', :action => 'show'

Хотя я, безусловно, готов пойти на ':id~', так как он дает тот же результат, на данный момент я действительно просто разочарован и заинтересован в том, как бы вы построили маршрут, который соответствует '~:id'.

Стоит отметить, что я не хочу изменять мой метод to_param или моего реального пользователя и публиковать слагы, чтобы включить в него префикс ~. Я просто хочу, чтобы в маршруте указывалось, какое действие должно с этим справиться. Если я не ошибаюсь, это исключает использование чего-то вроде:

:requirements => {:id => /\~[a-zA-Z0-9]/}

Заранее спасибо за любую помощь, которую вы можете оказать!

Обновление: Мне известно о приоритете маршрута, и выше было указано, что я размещаю маршрут '~:id' выше маршрута ':id'. Я получаю следующую ошибку при попытке создать URL-адрес, например post_path(@post):

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.to_sym

1 Ответ

1 голос
/ 23 июля 2010

Маршруты имеют приоритет в зависимости от порядка, в котором они объявлены.
Когда вы определяете первый маршрут: id, второй никогда не выполняется.

Для того, чтобы это работало, высначала нужно определить маршрут ~: id, а затем: id.

map.post '~:id', :controller => 'posts', :action => 'show'
map.post ':id',  :controller => 'users', :action => 'show'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...