0

因此,我一直在开发一个相当简单的 rails 4 应用程序,并且已经到了需要添加用户身份验证的地步。特别是,我想通过设计和omniauth的组合使用谷歌应用程序(只有谷歌应用程序)身份验证。现在,devise 有一个教程,据说可以告诉你如何设置类似的东西。在安装设计并在教程中进行建议的更改后,一切看起来都很棒。我点击了我的登录链接,并被正确发送到谷歌进行身份验证。但是,在我提供凭据后,我立即收到路由错误:

uninitialized constant Users

这令人困惑。据我了解,这意味着控制器丢失了......但我肯定有users_controller.rb,它应该在哪里。除此之外,我没有任何线索。

这是我route.rb的参考:

  resources :instances, :users

  devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks' }

  # authentication routes
  devise_scope :user do
    get 'sign_in', :to => 'devise/sessions#new', :as => :new_user_session
    get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
  end

  root to: 'instances#index'

这是结果rake routes

                 Prefix Verb     URI Pattern                            Controller#Action
              instances GET      /instances(.:format)                   instances#index
                        POST     /instances(.:format)                   instances#create
           new_instance GET      /instances/new(.:format)               instances#new
          edit_instance GET      /instances/:id/edit(.:format)          instances#edit
               instance GET      /instances/:id(.:format)               instances#show
                        PATCH    /instances/:id(.:format)               instances#update
                        PUT      /instances/:id(.:format)               instances#update
                        DELETE   /instances/:id(.:format)               instances#destroy
                  users GET      /users(.:format)                       users#index
                        POST     /users(.:format)                       users#create
               new_user GET      /users/new(.:format)                   users#new
              edit_user GET      /users/:id/edit(.:format)              users#edit
                   user GET      /users/:id(.:format)                   users#show
                        PATCH    /users/:id(.:format)                   users#update
                        PUT      /users/:id(.:format)                   users#update
                        DELETE   /users/:id(.:format)                   users#destroy
user_omniauth_authorize GET|POST /users/auth/:provider(.:format)        users/omniauth_callbacks#passthru {:provider=>/google_apps/}
 user_omniauth_callback GET|POST /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:google_apps)
       new_user_session GET      /sign_in(.:format)                     devise/sessions#new
   destroy_user_session GET      /sign_out(.:format)                    devise/sessions#destroy
                   root GET      /                                      instances#index

另外值得注意的是,我正在运行 rails 4 并设计 3.0.0.rc(因为它与 rails 4 兼容)

让我知道您是否还需要其他任何东西,但几乎所有其他相关的内容都在教程中。

4

1 回答 1

2

你的问题出在这里::omniauth_callbacks => 'users/omniauth_callbacks'

'users/omniauth_callbacks'转换为Users::OmniauthCallbacksController。虽然您的应用程序确实有一个User模型和一个UserController,但您还没有声明一个定义Users命名空间的常量。

您需要在该命名空间中添加一个控制器来处理回调:

# app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  # action names should match the names of the providers
  def facebook; end
  def twitter; end
  def github; end
  ...
end
于 2013-06-28T21:21:05.723 回答