2013-02-11 2 views
0

Я работаю над веб-приложением по управлению проектами, и у меня есть страницы для просмотра проектов. Один из них предназначен для просмотра всех проектов, а другой для управления проектом, которым владеет пользователь (т.е. является администратором).Смущающая проблема маршрутизации

Как сейчас, можно обратиться к обзорной странице проектов с помощью «projects_path» (/ projects). Однако для страницы управления проектом я хочу иметь еще один URL-адрес, «проекты/управление», и здесь мне нужна помощь.

Я попытался следующие:

routes.rb:

match "/projects/manage" => "projects#manage", :as => 'manage_projects' 

вид:

<%= link_to "Manage projects", manage_projects_path %> 

Возникает следующее сообщение об ошибке:

Couldn't find Project with id=manage 
app/controllers/projects_controller.rb:62:in `show' 

Почему это направляет меня на действие «показать», когда я явно задал его, чтобы направить меня «управлять» (проекты # управлять)? По-видимому, он хочет «id», что не должно быть здесь, потому что я хочу показать все проекты (которые принадлежат пользователю), а не конкретные.

Как я могу это решить?

ответ

0

Если вы выполняете управлять действием на нескольких проектах, лучше написать коллекцию действий в следующим образом,

resources :projects do 
    collection do 
    get "manage" 
    end 
end 

Это обеспечит вам маршрутные/проекты/управления, будет автоматически соответствовать маршрут для управления действие и все будет в соответствии с соглашениями REST.

+0

Интересно. Какой путь я должен использовать для доступа к нему? – dracula

+0

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

+0

Большое спасибо за это! – dracula

0

Эта линия

match "/projects/manage" => "projects#manage", :as => 'manage_projects' 

, скорее всего, после того, как добавили resources :projects. Переместите эту линию над ресурсами один, и вы должны быть хорошими. что-то вроде

match "/projects/manage" => "projects#manage", :as => 'manage_projects' 
resources :projects 

UPDATE:

Маршруты упорядочены. Маршруты в верхней части файла имеют приоритет. Если resources :projects находится перед match "/projects/manage" => "projects#manage", :as => 'manage_projects', собирается /projects/manage идет на шоу действия контроллера проектов, поскольку он соответствует /projects/:id перед тем /projects/manage

0

Когда приложение Rails получает входящий запрос

GET /projects/17 

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

match "/projects/:id" => "projects#show" 

запрос отправляется на шоу действия контроллера проектов, с {: ид => «17»} в Params.

Аналогично, когда приложение Рельсы принимает входящий запрос

GET /projects/manage 

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

match "/projects/manage" => "projects#manage", :as => 'manage_projects' 

запрос отправляется управлять действием контроллера проектов, без заботясь о ид, как не дано в маршрутах.

Но если первый соответствующий маршрут для проектов ресурсов себя для проектов, то она будет идти шоу действия, как он будет относиться к manage, как ваш id так же, как имеющие /projects/:id и матч получит пропускаются.

Так что это зависит от того, что вы дали сначала, то есть ресурса или соответствия. Приоритет важен.