2016-07-24 2 views
2

Rails 5 API에 Devise Token Auth을 통합합니다.Devise Token Auth - 버전이 지정된 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'

. (일을 제대로 더 이상 범위 때문에)

class ApplicationController < ActionController::API 
    include ActionController::Serialization 
    include DeviseTokenAuth::Concerns::SetUserByToken 
end 

그러나 물론 이것은 다른로드 오류가 발생합니다 :

내가 그것을 만들 application_controller.rbmodule 분리를 제거 할 수 있습니다, 문제를 해결하지하려면 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 

하지만 버전의 전체 목적을 격파한다. 내가 놓친 게 있니?

답변

3

그 멋진 기본 범위 지정이 발생하지 않습니다, 그러나 이것은 나를 위해 작동 :

Rails.application.routes.draw do 
    namespace :api do 
    scope :v1 do 
     mount_devise_token_auth_for 'User', at: 'auth' 
    end 
    end 
end 

큰 차이는 그 외에도 내 정상 범위별로 버전와 ApplicationController, 나는에서와 ApplicationController이

class ApplicationController < ActionController::API 
    include DeviseTokenAuth::Concerns::SetUserByToken 
end 

이 적합하지 않을 수 있지만,이 DeviseTokenAuth 현재 설계 방식으로 작동합니다 읽어 app/controller/application_controller.rb. 적절한 수정 프로그램에는 DeviseTokenAuth 자체의 변경이 포함될 수 있습니다.

이 정보가 도움이되기를 바랍니다.

api_user_session POST /api/v1/auth/sign_in(.:format) devise_token_auth/sessions#create

: 위의 코드로, 나는 그것을이해야 할 일을하기 위해 노력하고 다음과 같은 경로를 가지고있다. . . 비슷한 솔루션을 시도했을 때 언급 한 '다른로드 오류'가 표시되지 않습니다.

+0

답변 해 주셔서 감사합니다. 지금 일하고있어 시험 할 수는 없지만 몇 시간 만에 끝낼 것입니다. –

+2

이것은 트릭을 만들었지 만 이미 시도한 것처럼 느껴지지만 ... 나는 그렇지 않을 것입니다! 실제로 API에 여러 버전이있는 경우 범위 : v1, as : : v1'을 작성해야합니다. '경로 이름이 잘못되었습니다. 이미 사용하고있는'new_api_user_session '입니다. . 버전도 범위가 아닌 이름 공간이 될 수 있지만이 문제를 해결할 수는 있지만 전반적인 구조의 유연성이 떨어집니다. –

0

Devise는 내장 된 컨트롤러를 자신의 ApplicationController에서 상속하려고 시도하지만 앱에는 해당 클래스가 존재하지 않습니다. 대신 Api::V1::ApplicationController 클래스가 있습니다.

다행히도 Devise가 다른 것을 상속하도록 구성 할 수 있습니다. config/initializers/devise.rb에서 다음을 수행하십시오.

config.parent_controller = 'Api::V1::ApplicationController' 
+0

답장을 보내 주셔서 감사합니다.하지만 단 하나의 API 버전 만 올바른 부모 컨트롤러를 가질 수 있기 때문에 버전 관리의 목적에 어긋납니다. –

관련 문제