如何在 REST API 中为当前用户提供路由?

Amr*_*man 4 api routes ruby-on-rails

所以我users在我的路线中定义了一个简单的资源。

resources :users
Run Code Online (Sandbox Code Playgroud)

我需要提供一条路线,以便登录的用户可以在前端获取他的信息。我想过这样做:

resources :users do
  get 'current' , on: :collection
end
Run Code Online (Sandbox Code Playgroud)

但这在语义上意味着该路由给出当前用户的列表,而不是当前用户。事实上,如果我这样做rake routes,它会将路径前缀显示为:current_users

我可以通过执行以下操作来解决路径前缀:

get '/users/current' => 'users#current', as: 'current_user'
Run Code Online (Sandbox Code Playgroud)

但这看起来仍然提供了用户列表。所以,我想知道是否有一种“正确的方法”来做这种事情以及如何在 Rails 中做到这一点?还是我想太多了,我拥有的一切都很好?

Ric*_*eck 5

如果有一个“正确的方法”

“正确”的方法是使用单一资源

#config/routes.rb
resource :user #-> url.com/user -> users#show
Run Code Online (Sandbox Code Playgroud)

当然,“正确”的方式就意味着有“错误”的方式,但事实并非如此。

编程是为数不多的可以做任何你想做的事的实践之一,只要能达到结果。当然,你如何实现这一结果可能会受到批评;最终,有无数种方法可以实现这一目标......

#config/routes.rb
resources :users do
  get :current, on: :collection #-> url.com/users/current -> users#current
end

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def current
      @user = current_user
   end
end 
Run Code Online (Sandbox Code Playgroud)

上面(你的代码)的作用与我的代码的作用相同,只是以不同的方式。

仅仅因为您使用的是集合路由,并不意味着您需要传递集合。“集合”路由主要针对Rails路由结构;这些路线对您的后端代码没有影响。

--

这也意味着您应该愿意尝试使用选项/开关来自定义您的路由:

#config/routes.rb
resource :user, path: "current_user", as: :current_user #-> url.com/current_user -> users#show
Run Code Online (Sandbox Code Playgroud)