Если текущий пользователь, скажем, 42, то /user/42
и /user
будут отображать ту же информацию, но /user/23
будет отображать урезанную общедоступную версию данных 23.Таким образом, обработчик для /user/:id
должен будет знать, что особый случай :id
является текущим пользователем;обработчик для /user
также должен будет знать об этом особом случае, поскольку это все, что он делает.
Если вы используете два маршрута, то вы либо дублируете код, оборачивая реальный код в дополнительный слой,или какая-то другая занятая работа.Я просто отправил бы их обоих в один и тот же метод контроллера, и это могло бы начаться с чего-то вроде этого:
user = params['id'] ? User.find(params['id']) : current_user
А потом вы обрабатываете особый случай, когда запрашиваемый пользователь является текущим пользователем всего за один раз.Поместите что-нибудь простое:
if(user == current_user)
# show the full blob of information
else
# show just the limited public information
end
Конечно, вы можете нарезать его на несколько маленьких методов, таких как show_current_user_info
и show_other_user_info
, внутри контроллера.Обработчик для /user
может быть просто вызовом show_current_user_info
;обработчик /user/:id
может вызывать show_current_user_info
или show_other_user_info
в зависимости от значения :id
.Этот подход для меня пахнет бессмысленно.