0

Я рассмотрении "Rails Routing From The Outside In" секцию Rails Guides, и я наткнулся на этот раздел:Как Rails знает, какое действие «показать» контроллера для использования в этом примере из Rails Guides?

Иногда у вас есть ресурс, чтобы клиенты всегда смотреть без ссылающегося идентификатор. Например, вы хотели бы, чтобы/profile всегда отображал профиль пользователя в настоящее время вошедшего в систему пользователя. В этом случае, вы можете использовать сингулярный ресурсов для отображения/профиля (а не/профиля /: ид) в шоу действия:

get 'profile', to: 'users#show' 

Передача строки в соответствии будет ожидать формат действий контроллера #, при прохождении символа непосредственно сопоставляется действия:

get 'profile', to: :show 

в руководстве говорится, что «пропускании символ будет отображать непосредственно к действию», но, скажем, у меня есть несколько контроллеров, которые у каждого есть «показать действия. Как Rails знает, какой из них использовать, поскольку я больше не ссылаюсь на конкретный контроллер?

ответ

2

Эта документация несколько вводит в заблуждение, не так ли. Это плохой пример. Комментарий о прохождении символов для сопоставления является общим комментарием и должен находиться вне раздела об особых ресурсах.

Действительно, если вы попытаетесь это автономным, вы получите следующее сообщение об ошибке при запуске Rails или работают rake routes:

rake routes 
rake aborted! 
missing :controller 

Таким образом, вы бы добавить :controller вариант для того, чтобы работать за пределами ресурса объявление:

get 'profile', to: :show, controller: 'users' 

синтаксис они указывают действителен внутри resources или resource декларации, например:

resources :user do 
    collection do 
    get 'profile', to: :show 
    end 
end 

или

resource :user do 
    get 'profile', to: :show 
end 

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

+0

Кажется, что строка 'get 'profile', to: 'users # show', controller: 'users'' должен быть' get' profile ', чтобы:: show, controller:' users''. Опция 'controller' не действует, если мы напишем строку первым способом. – izaban

+0

Спасибо izaban, хороший момент. Я обновил этот пример. – sampierson

2

Оказывается, что он не знает ...

#config/routes.rb 

get 'profile', to: :show 

Из консоли:

$ rake routes 
rake aborted 
missing :controller 

Первый пример: 'пользователи # шоу', не создать успешный маршрут, как это делает

get 'profile', to: :show, controller: 'users'