Неинициализированная константа SessionsController в API
Я пишу API и пытаюсь войти через API и получаю uninitialized constant SessionsController
Ошибка, сопровождаемая подсказкой "Попробуйте запустить грабли для получения дополнительной информации о доступных маршрутах". когда я пытаюсь перейти на URL
http://localhost:3000/api/v1/login
как POST
Мои маршруты показывают, что маршрут и действие существуют, как показано:
api_v1_users GET /api/v1/users(.:format) api/v1/users#index {:format=>"json"}
POST /api/v1/users(.:format) api/v1/users#create {:format=>"json"}
new_api_v1_user GET /api/v1/users/new(.:format) api/v1/users#new {:format=>"json"}
edit_api_v1_user GET /api/v1/users/:id/edit(.:format) api/v1/users#edit {:format=>"json"}
api_v1_user GET /api/v1/users/:id(.:format) api/v1/users#show {:format=>"json"}
PUT /api/v1/users/:id(.:format) api/v1/users#update {:format=>"json"}
DELETE /api/v1/users/:id(.:format) api/v1/users#destroy {:format=>"json"}
new_api_v1_user_session GET /api/v1/login(.:format) sessions#new {:format=>"json"}
api_v1_user_session POST /api/v1/login(.:format) sessions#create {:format=>"json"}
destroy_api_v1_user_session DELETE /api/v1/logout(.:format) sessions#destroy {:format=>"json"}
api_v1_user_omniauth_authorize GET|POST /auth/:provider(.:format) authentications#passthru {:provider=>/twitter|facebook/, :format=>"json"}
api_v1_user_omniauth_callback GET|POST /auth/:action/callback(.:format) authentications#(?-mix:twitter|facebook) {:format=>"json"}
api_v1_user_password POST /api/v1/password(.:format) api/v1/passwords#create {:format=>"json"}
new_api_v1_user_password GET /api/v1/password/new(.:format) api/v1/passwords#new {:format=>"json"}
edit_api_v1_user_password GET /api/v1/password/edit(.:format) api/v1/passwords#edit {:format=>"json"}
PUT /api/v1/password(.:format) api/v1/passwords#update {:format=>"json"}
cancel_api_v1_user_registration GET /api/v1/cancel(.:format) registrations#cancel {:format=>"json"}
api_v1_user_registration POST /api/v1(.:format) registrations#create {:format=>"json"}
new_api_v1_user_registration GET /api/v1/sign_up(.:format) registrations#new {:format=>"json"}
edit_api_v1_user_registration GET /api/v1/edit(.:format) registrations#edit {:format=>"json"}
PUT /api/v1(.:format) registrations#update {:format=>"json"}
DELETE /api/v1(.:format) registrations#destroy {:format=>"json"}
Когда я пытаюсь получить доступ к учетной записи с помощью authentication_token
Параметр URL, он работает нормально.
http://localhost:3000/api/v1/users/39?user_token=DxwspVzYSpsiLosd9xcE
Используя это, я могу сделать PUT
а также GET
просит без проблем.
Мои маршруты выглядят так:
namespace :api, defaults: {format: 'json'} do
namespace :v1 do
resources :users
devise_for :users, :path => '', path_names: {sign_in: "login", sign_out: "logout"},
controllers: {omniauth_callbacks: "authentications", registrations: "registrations", sessions: "sessions"}
end
end
Я предполагаю, что это проблема в моем SessionsController, но не могу понять, почему PUT
запрос будет работать, но POST
не будет. Здесь SessionsController
:
module Api
module V1
class SessionsController < Devise::SessionsController
before_filter :authenticate_user!, except: [:create, :destroy]
before_filter :ensure_params_exist
skip_before_filter :verify_authenticity_token
def create
resource = User.find_for_database_authentication(email: params[:user_login][:email])
return invalid_login_attempt unless resource
if resource.valid_password?(params[:user_login][:password])
sign_in("user", resource)
resource.ensure_authentication_token!
render 'api/v1/sessions/new.json.jbuilder', status: 201
return
end
invalid_login_attempt
end
def destroy
current_user.reset_authentication_token
render json: {success: true}
end
protected
def ensure_params_exist
return unless params[:user_login].blank?
render json: {success: false, message: "missing user_login parameter"}, status: 422
end
def invalid_login_attempt
render 'api/v1/sessions/invalid.json.jbuilder', status: 401
end
end
end
end
2 ответа
Так что в моем файле маршрутов у меня было
namespace :api, defaults: {format: 'json'} do
namespace :v1 do
resources :users
devise_for :users, path: '', path_names: {sign_in: "login", sign_out: "logout"},
controllers: {omniauth_callbacks: "authentications", registrations: "registrations", sessions: "sessions"}
end
end
Я удалил sessions: "sessions"
и все отлично работает. Я не собираюсь отмечать это как правильный ответ, потому что я не знаю, почему это решило проблему, или, более конкретно, почему добавление sessions: "sessions"
был причиной ошибки в первую очередь. Надеюсь, кто-то может объяснить это для будущих читателей.
РЕДАКТИРОВАТЬ:
Я понял намного позже, что проблема заключалась в том, что я ссылался на sessions_controller
, когда я хотел сослаться на api/v1/sessoins_controller
Там нет регулярных sessions_controller
Я просто использую Devise, но есть sessions_controller
в API/V1
Пространство имен. Вот почему проблема произошла.
Для дальнейшего использования для тех, кто сталкивается с этой проблемой, ошибка говорит о том, что искомый контроллер не существует должным образом, поэтому для устранения неполадок убедитесь, что вы ищете контроллер в правильном месте, и с правильным именем.
В аналогичном случае для приложения API с рельсами 6 и разработкой 4.8.1 я использовал
scope
а также
devise_scope
настроить маршруты в соответствии с devises doc.
devise_for
был
skip
-ред.
В моем случае:
scope :api, defaults: { format: :json } do
scope :v1 do
devise_for :users, skip: :all
devise_scope :user do
post '/sign_in', to: 'devise/sessions#create'
delete '/sign_out', to: 'devise/sessions#destroy'
post '/sign_up', to: 'devise/registrations#create'
put '/account_update', to: 'devise/registrations#update'
delete '/account_delete', to: 'devise/registrations#destroy'
end
end
end