路由错误未初始化常量用户
Posted
技术标签:
【中文标题】路由错误未初始化常量用户【英文标题】:Routing Error uninitialized constant Users 【发布时间】:2012-11-24 00:47:51 【问题描述】:我是 Rails 新手...我正在尝试设置 Sign in with 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 包含: 即 app/controllers/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
追踪:
于 2012-11-23 22:39:32 -0800 开始为 127.0.0.1 获取“/users/auth/facebook” (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)
【问题讨论】:
这是this question 的完全相同的副本。下次尝试搜索您的错误 :) 如果您希望控制器命名为Users::OmniauthCallbacksController
,那么它需要在 app/controllers/users/omniauth_callbacks_controller.rb
中。如果您不希望控制器嵌套文件夹,则只需将控制器命名为 class OmniauthCallbacksController < Devise::OmniauthCallbacksController
@uDaY:我已经添加了踪迹...
@Ashitaka:感谢您的快速回复。我已经尝试更改名称,但没有成功:)
我打赌你改了名字,留下的路线仍然指向users/omniauth_callbacks
。要么删除 users
部分,要么必须将控制器放在 users
文件夹中。
【参考方案1】:
mv
app/controllers/omniauth_callbacks_controller.rb
到
app/controllers/users/omniauth_callbacks_controller.rb
或改变
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
到
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
【讨论】:
这是一个更好的答案,它直接指出了问题所在。而且还干净!谢谢routes.rb
中第三种可能的错误配置,如果您决定命名控制器,请确保您有 devise_for :users, controllers: omniauth_callbacks: 'omniauth_callbacks'
或 omniauth_callbacks: 'users/omniauth_callbacks'
【参考方案2】:
我认为那部分搞砸了:
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
并根据 params[:provider] 值包装 passthru 方法以将操作委托给适当的私有/受保护方法
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
【讨论】:
以上是关于路由错误未初始化常量用户的主要内容,如果未能解决你的问题,请参考以下文章
使用 ActiveMerchant::Billing::EwayManagedGateway 的未初始化常量错误