我正在將Devise Token Auth整合到我的版本爲的Rails 5 API中。下面是結構:設計令牌認證 - 版本化API:未初始化的常量ApplicationController
的Gemfile:
source 'https://rubygems.org'
...
gem 'omniauth', '~> 1.3'
gem 'devise_token_auth', '~> 0.1.38'
...
的routes.rb:
require "api_constraints"
Rails.application.routes.draw do
namespace :api, defaults: { format: :json } do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
mount_devise_token_auth_for 'User', at: 'auth'
resources :users
end
end
end
application_controller.rb(APP /控制器/ API/V1 /):
module Api
module V1
class ApplicationController < ActionController::API
include ActionController::Serialization
include DeviseTokenAuth::Concerns::SetUserByToken
end
end
end
當我嘗試POST:
{
"email": "[email protected]",
"password": "testuserpassword"
}
到/api/auth/sign_in
,我得到的錯誤ActionController::RoutingError (uninitialized constant ApplicationController)
。
看起來devise_controller
在嘗試調用自己的方法時無法訪問ApplicationController
。於是,我嘗試設置基本控制器:
mount_devise_token_auth_for 'User', at: 'auth', base_controller: 'Api::V1::ApplicationController'
這也沒有工作。
要解決這個問題,我可以刪除module
分離,application_controller.rb
使其:
class ApplicationController < ActionController::API
include ActionController::Serialization
include DeviseTokenAuth::Concerns::SetUserByToken
end
但當然會導致不同的負載誤差(因爲事情不再作用域正確):LoadError (Unable to autoload constant Api::V1::ApplicationController, expected /home/ubuntu/workspace/app/controllers/api/v1/application_controller.rb to define it)
。
,實際工作是沒有它命名空間/模塊中的作用域在所有的唯一的事:
Rails.application.routes.draw do
mount_devise_token_auth_for 'User', at: 'auth'
namespace :api, defaults: { format: :json } do
scope module: :v1,
constraints: ApiConstraints.new(version: 1, default: true) do
resources :users
end
end
end
但失敗版本的整個目的。我錯過了什麼嗎?
感謝您的回答!我現在在工作,所以我無法測試這個,但我會在幾個小時之內。 –
這樣做的伎倆,雖然我覺得我已經嘗試過......我猜不是!如果您的API實際上有多個版本,則需要將範圍:'scope:v1,as::v1'以避免出現錯誤:'無效的路由名稱已被使用:'new_api_user_session'' 。這些版本也可以是命名空間而不是範圍的,這可以解決這個問題,但是這似乎使整體結構不夠靈活。 –