Эй! Я пытаюсь настроить маршруты в приложении Rails, чтобы в зависимости от типа передаваемого параметра Rails отправлял запрос другому действию.
У меня есть courses
, у которого есть атрибут state
, представляющий собой строку с двухбуквенным сокращением состояния. Когда пользователь посещает /courses/1
, я хочу, чтобы Rails отображал действие show
в контроллере courses
(и передавал параметр как :id
). Когда пользователь посещает /courses/CO
, я хочу, чтобы Rails отображал действие index
и передавал параметр как :state
.
Так что /courses/1
будет эквивалентно
:controller => 'courses', :action => 'show', :id => '1'
И /courses/CO
будет эквивалентно
:controller => 'courses', :action => 'index', :state => 'CO'
Я пробовал это:
map.resources :courses, :except => { :index, :show }
map.connect 'courses/:state', :controller => 'courses', :action => 'index', :state => /[A-Z]{2}/
map.connect 'courses/:id', :controller => 'courses', :action => 'show', :id => /[0-9]+/
Но он ломается (сервер рельсов даже не запускается). Я обычно не делаю таких вещей с маршрутами, поэтому я не в курсе своих ноу-хау. Спасибо!
Редактировать: Исправлена опечатка, спасибо JC.
Текущее решение выглядит так:
map.resources :courses, :except => [ :index, :show ]
map.courses '/courses', :controller => 'courses', :action => 'index', :state => 'AL', :method => :get
map.courses '/courses/:state', :controller => 'courses', :action => 'index', :requirements => { :state => /[A-Z]{2}/ }, :method => :get
map.course '/courses/:id', :controller => 'courses', :action => 'show', :requirements => { :id => /[0-9]+/ }, :method => :get