路由错误未初始化的常量用户

我是一个铁杆新手…我正在尝试设置登录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 = "/users/auth" config.omniauth :facebook, "ABC", "XYZ",{:client_options => { :ssl => { :verify => false } }} 

OmniAuthController包含:ie app / controllers / omniauth_callbacks_controller.rb

 class Users::OmniauthCallbacksController  :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  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 

跟踪:

在2012-11-23 22:39:32 -0800(facebook)开始获取127.0.0.1的GET“/ users / auth / facebook”。回调阶段已启动。

开始GET“/ users / auth / facebook / callback?

 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) 

MV

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

应用程序/控制器/用户/ omniauth_callbacks_controller.rb

或改变

 class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 

 class OmniauthCallbacksController < Devise::OmniauthCallbacksController 

我相信这部分搞砸了:

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

很少测试,对你来说:

放在你看来:

 <%= link_to users_auth_facebook_path, users_auth_facebook_path %> 

并点击它,它也给出了同样的错误……

我相信你应该使用类似的东西(你在上面链接的wiki中提到的):

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

并使用passthru方法将操作委派给适当的私有/受保护方法,具体取决于params [:provider]值

 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