неинициализированная константа SessionsController в API

Я пишу API и пытаюсь войти в систему с помощью API и получаю сообщение об ошибке uninitialized constant SessionsController, за которым следует подсказка «Попробуйте запустить rake route для получения дополнительной информации о доступных маршрутах». когда я пытаюсь перейти по URL

http://localhost:3000/api/v1/login as a 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"}

Когда я пытаюсь получить доступ к учетной записи, используя параметр URL-адреса authentication_token, все работает нормально.

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

person Arel    schedule 27.09.2013    source источник


Ответы (1)


Итак, в моем файле маршрутов у меня было

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. Вот почему возникла проблема.


Для справки в будущем для всех, кто столкнется с этой проблемой, ошибка сообщает вам, что контроллер, который вы ищете, не существует, как должен, поэтому для устранения неполадок убедитесь, что вы ищете контроллер в правильном месте, и с правильным названием.

person Arel    schedule 27.09.2013