2012-11-24 56 views
23

我是一個鐵軌新手......我正在嘗試設置登錄Facebook的演示應用程序。我使用OmniAuth並按照本教程路由錯誤未初始化的常量用戶

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

我重定向到fb時出現此錯誤:

Routing Error: 

    uninitialized constant Users 

    Try running rake routes for more information on available routes. 

環境

Windows 7 
Rails version :3.2.9.rc2 
omniauth-1.1.1 
devise-2.1.2 

我的routes.rb看起來是這樣的:

root :to => 'static_pages#home' 
    resources :users 
    get "static_pages/home" 
    match '/auth/facebook' => 'omniauth#passthru' 
    match '/users/auth/facebook' => 'users/omniauth_callbacks#passthru' 
    devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } , :strategy_class => OmniAuth::Strategies::Facebook 

devise.rb包含:

require 'devise/orm/active_record' 
require 'omniauth-facebook' 

config.omniauth_path_prefix = "https://stackoverflow.com/users/auth" 
    config.omniauth :facebook, "ABC", "XYZ",{:client_options => { :ssl => { :verify => false } }} 

而且OmniAuthController包含: 即應用程序/控制器/ omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 

    def facebook 
    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user) 

    if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
    else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     #redirect_to new_user_registration_url 
     redirect_to "static_pages_home" 
    end 
    end 

    def passthru 
    render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false 
    # Or alternatively, 
    # raise ActionController::RoutingError.new('Not Found') 
    end 


end 

模型User.rb包含:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 
    attr_accessible :date_of_birth, :firstName, :lastName, :mailId, :phone, :provider, :uid 
    devise :omniauthable 

protected 


def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
    user = User.find(:provider => auth.provider, :uid => auth.uid).first 
    unless user 
     user = User.create(name:auth.extra.raw_info.name, 
          provider:auth.provider, 
          uid:auth.uid, 
          email:auth.info.email, 
          password:Devise.friendly_token[0,20] 
          ) 
    end 
    user 
    end 

def self.new_with_session(params, session) 
    super.tap do |user| 
     if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] 
     user.email = data["email"] if user.email.blank? 
     end 
    end 
    end 

end 

跟蹤:

啓動GET「/ users/auth/facebook」for 127.0.0.1 at 2012-11-23 22:39:32 -0800 (facebook)回調階段已啓動。

入門使用「/用戶/認證/ Facebook的/回調

state=XYZ&code=ABC" for 127.0.0.1 at 2012-11-23 22:39:33 -0800 

ActionController::RoutingError (uninitialized constant Users): 
    activesupport (3.2.9.rc2) lib/active_support/inflector/methods.rb:230:in `block in constantize' 
    activesupport (3.2.9.rc2) lib/active_support/inflector/methods.rb:229:in `each' 
    activesupport (3.2.9.rc2) lib/active_support/inflector/methods.rb:229:in `constantize' 
    actionpack (3.2.9.rc2) lib/action_dispatch/routing/route_set.rb:69:in `controller_reference' 
    actionpack (3.2.9.rc2) lib/action_dispatch/routing/route_set.rb:54:in `controller' 
    actionpack (3.2.9.rc2) lib/action_dispatch/routing/route_set.rb:32:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/routing/mapper.rb:42:in `call' 
    journey (1.0.4) lib/journey/router.rb:68:in `block in call' 
    journey (1.0.4) lib/journey/router.rb:56:in `each' 
    journey (1.0.4) lib/journey/router.rb:56:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/routing/route_set.rb:600:in `call' 
    omniauth (1.1.1) lib/omniauth/strategy.rb:394:in `call_app!' 
    omniauth (1.1.1) lib/omniauth/strategy.rb:356:in `callback_phase' 
    omniauth-oauth2 (1.1.1) lib/omniauth/strategies/oauth2.rb:77:in `callback_phase' 
    omniauth (1.1.1) lib/omniauth/strategy.rb:219:in `callback_call' 
    omniauth (1.1.1) lib/omniauth/strategy.rb:175:in `call!' 
    omniauth (1.1.1) lib/omniauth/strategy.rb:157:in `call' 
    warden (1.2.1) lib/warden/manager.rb:35:in `block in call' 
    warden (1.2.1) lib/warden/manager.rb:34:in `catch' 
    warden (1.2.1) lib/warden/manager.rb:34:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
    rack (1.4.1) lib/rack/etag.rb:23:in `call' 
    rack (1.4.1) lib/rack/conditionalget.rb:25:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/head.rb:14:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/flash.rb:242:in `call' 
    rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context' 
    rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/cookies.rb:341:in `call' 
    activerecord (3.2.9.rc2) lib/active_record/query_cache.rb:64:in `call' 
    activerecord (3.2.9.rc2) lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call' 
    activesupport (3.2.9.rc2) lib/active_support/callbacks.rb:405:in `_run__959081092__call__942932381__callbacks' 
    activesupport (3.2.9.rc2) lib/active_support/callbacks.rb:405:in `__run_callback' 
    activesupport (3.2.9.rc2) lib/active_support/callbacks.rb:385:in `_run_call_callbacks' 
    activesupport (3.2.9.rc2) lib/active_support/callbacks.rb:81:in `run_callbacks' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/reloader.rb:65:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/remote_ip.rb:31:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call' 
    railties (3.2.9.rc2) lib/rails/rack/logger.rb:32:in `call_app' 
    railties (3.2.9.rc2) lib/rails/rack/logger.rb:16:in `block in call' 
    activesupport (3.2.9.rc2) lib/active_support/tagged_logging.rb:22:in `tagged' 
    railties (3.2.9.rc2) lib/rails/rack/logger.rb:16:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/request_id.rb:22:in `call' 
    rack (1.4.1) lib/rack/methodoverride.rb:21:in `call' 
    rack (1.4.1) lib/rack/runtime.rb:17:in `call' 
    activesupport (3.2.9.rc2) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
    rack (1.4.1) lib/rack/lock.rb:15:in `call' 
    actionpack (3.2.9.rc2) lib/action_dispatch/middleware/static.rb:62:in `call' 
    railties (3.2.9.rc2) lib/rails/engine.rb:479:in `call' 
    railties (3.2.9.rc2) lib/rails/application.rb:223:in `call' 
    rack (1.4.1) lib/rack/content_length.rb:14:in `call' 
    railties (3.2.9.rc2) lib/rails/rack/log_tailer.rb:17:in `call' 
    rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service' 
    c:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service' 
    c:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run' 
    c:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread' 


    Rendered c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.9.rc2/lib/action_dispatch/middleware/templates/rescues/ 
ing_error.erb within rescues/layout (0.0ms) 
+0

你能提供的痕跡? – uday

+1

這是[此問題]的確切副本(http://stackoverflow.com/questions/6912542/routingerror-uninitialized-constatnt)。嘗試下次搜索你的錯誤:) 如果你想要你的控制器命名爲'Users :: OmniauthCallbacksController',那麼它需要在'app/controllers/users/omniauth_callbacks_controller.rb'中。如果你不想爲你的控制器嵌套文件夾,那麼簡單地命名你的控制器'類OmniauthCallbacksController Ashitaka

+0

@uDaY:我已經添加了跟蹤... –

回答

71

MV

應用程序/控制器/ omniauth_callbacks_controller.rb

應用程序/控制器/用戶/ omniauth_callbacks_controller。RB

或更改

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 
+2

這真是好得多的答案,它直接指向了這個問題。而且乾淨!謝謝 – Aleks

+1

如果您決定命名空間控制器,'routes.rb'中可能存在第三個錯誤配置,請確保您具有'devise_for:users,controllers:{omniauth_callbacks:'omniauth_callbacks'}或omniauth_callbacks:'users/omniauth_callbacks' –

1

我相信部分是搞亂?

match '/users/auth/facebook' => 'users/omniauth_callbacks#passthru' 

小測試,爲您提供:

放於您的看法:

<%= link_to users_auth_facebook_path, users_auth_facebook_path %> 

,並點擊遵循它,這也給了同樣的錯誤...

我相信你應該使用類似(什麼是維基你上面鏈接中提到):

devise_scope :user do 
    get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' 
end 

,敷中繼方法委託動作撥出取決於PARAMS私人/受保護的方法[:提供商]值

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def passthru 
    send(params[:provider]) if providers.include?(params[:provider]) 
    end 

    protected 

    def facebook 
    raise "Implement me for facebook" 
    end 

    def twitter 
    raise "Implement me for twitter" 
    end 

    private 

    def providers 
    ["facebook", "twitter"] 
    end 
end 
相關問題