【问题标题】:uninitialized constant SessionsController in APIAPI 中未初始化的常量 SessionsController
【发布时间】:2013-10-04 03:10:15
【问题描述】:

我正在编写一个 API 并尝试使用该 API 登录并收到 uninitialized constant SessionsController 错误,然后提示“尝试运行 rake 路由以获取有关可用路由的更多信息”。当我尝试访问 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

【问题讨论】:

    标签: ruby-on-rails api devise uninitialized-constant


    【解决方案1】:

    对于带有 rails 6 和设计 4.8.1 的 API 应用程序的类似情况,我使用 scope 和 devise_scope 根据 devises doc 配置路由。 devise_for 是 skip-ed。

    就我而言:

      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
    

    【讨论】:

      【解决方案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 命名空间中。这就是问题发生的原因。


      供遇到此问题的其他人将来参考,该错误告诉您您要查找的控制器不存在,因此要进行故障排除,请确保您正在寻找正确的控制器地点,并使用正确的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        相关资源
        最近更新 更多