仅在 Rails API 中设计控制器“未初始化常量 Api::V1::RegistrationsController”

jul*_*lez 0 ruby-on-rails devise

我正在创建一个rails api,我希望资源处于/api/v1/路由状态,包括注册和身份验证。

我创建了以下路线,为我提供了 Devise 所需的路线:

config/routes.rb

namespace :api, defaults: { format: :json } do
  namespace :v1 do
    devise_for :users, as: 'api'
  end
end
Run Code Online (Sandbox Code Playgroud)

它提供:

                      Prefix Verb   URI Pattern                      Controller#Action
          new_api_user_session GET    /api/v1/users/sign_in(.:format)  api/v1/sessions#new {:format=>:json}
              api_user_session POST   /api/v1/users/sign_in(.:format)  api/v1/sessions#create {:format=>:json}
      destroy_api_user_session DELETE /api/v1/users/sign_out(.:format) api/v1/sessions#destroy {:format=>:json}
  cancel_api_user_registration GET    /api/v1/users/cancel(.:format)   api/v1/registrations#cancel {:format=>:json}
     new_api_user_registration GET    /api/v1/users/sign_up(.:format)  api/v1/registrations#new {:format=>:json}
    edit_api_user_registration GET    /api/v1/users/edit(.:format)     api/v1/registrations#edit {:format=>:json}
         api_user_registration PATCH  /api/v1/users(.:format)          api/v1/registrations#update {:format=>:json}
                               PUT    /api/v1/users(.:format)          api/v1/registrations#update {:format=>:json}
                               DELETE /api/v1/users(.:format)          api/v1/registrations#destroy {:format=>:json}
                               POST   /api/v1/users(.:format)          api/v1/registrations#create {:format=>:json}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试注册用户时,出现以下错误

ActionController::RoutingError:
   uninitialized constant Api::V1::RegistrationsController
Run Code Online (Sandbox Code Playgroud)

jul*_*lez 6

为了将资源保留在/api/v1/路径下并且仍然能够使用设备的默认控制器,需要修复路由。

与其使用namespace,不如使用scope

scope :api, defaults: { format: :json } do
  scope :v1 do
    devise_for :users
  end
end
Run Code Online (Sandbox Code Playgroud)

这样您甚至不必使用as: 'api'来识别您的资源

                  Prefix Verb   URI Pattern                      Controller#Action
        new_user_session GET    /api/v1/users/sign_in(.:format)  devise/sessions#new {:format=>:json}
            user_session POST   /api/v1/users/sign_in(.:format)  devise/sessions#create {:format=>:json}
    destroy_user_session DELETE /api/v1/users/sign_out(.:format) devise/sessions#destroy {:format=>:json}
cancel_user_registration GET    /api/v1/users/cancel(.:format)   devise/registrations#cancel {:format=>:json}
   new_user_registration GET    /api/v1/users/sign_up(.:format)  devise/registrations#new {:format=>:json}
  edit_user_registration GET    /api/v1/users/edit(.:format)     devise/registrations#edit {:format=>:json}
       user_registration PATCH  /api/v1/users(.:format)          devise/registrations#update {:format=>:json}
                         PUT    /api/v1/users(.:format)          devise/registrations#update {:format=>:json}
                         DELETE /api/v1/users(.:format)          devise/registrations#destroy {:format=>:json}
                         POST   /api/v1/users(.:format)          devise/registrations#create {:format=>:json}
Run Code Online (Sandbox Code Playgroud)