我遇到了一种情况(我猜的每个人都很标准),我必须做两件事:
如果用户要求/用户路径,我必须提供他/她的个人信息。
如果用户要求/ user /:id路径,我必须提供有关该特定用户的信息,或者当前用户信息if:id与current_user id匹配。
肯定有很多方法可以做到,但最好的方法是什么?我应该有两个不同的路由,如/ show /:id和/ show_current,由不同的操作处理,或只是有一个/ show /:id并在该操作中进行处理?
请记住,如果这是当前视图,我需要渲染一个与另一个视图不同的更详细的视图。我认为后者可能是更好的方式,但你怎么看?
答案 0 :(得分:2)
如果当前用户是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
。这种方法闻起来像是毫无意义的分层。
答案 1 :(得分:1)
在RESTful路由中,您已经描述了users_path
和user_path(some_id)
。这些映射到User#index
和User#show
。 index
方法通常是用户列表,但如果您希望index
显示current_user
个人信息,您当然可以这样做。如果您还需要一个列表方法,只需将其添加到您的控制器并创建一个路径。