web-dev-qa-db-fra.com

Erreur de routage Utilisateurs constants non initialisés

Je suis un Rails newbie ... J'essaye de mettre en place Connectez-vous avec facebook pour une application de démonstration. J'utilise OmniAuth et suis ce tutoriel

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

J'obtiens cette erreur lors de la redirection vers fB:

   Routing Error:

    uninitialized constant Users

    Try running rake routes for more information on available routes. 

Environnement

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

Mon routes.rb ressemble à ceci:

  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 contient:

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

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

Et OmniAuthController contient: c'est-à-dire 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

Le modèle User.rb contient:

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

Trace:

A commencé GET "/ users/auth/facebook" pour 127.0.0.1 à 2012-11-23 22:39:32 -0800 (facebook) Phase de rappel lancée.

Commencé 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)
26
amit modi

mv

app/controllers/omniauth_callbacks_controller.rb

à

application/contrôleurs/utilisateurs/omniauth_callbacks_controller.rb

ou changer

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

à

class OmniauthCallbacksController < Devise::OmniauthCallbacksController
78
why

Je crois que cette partie gâche:

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

Petit test, pour vous:

mettre dans votre vue:

<%= link_to users_auth_facebook_path, users_auth_facebook_path  %>

et suivez-le avec un clic, cela donne également la même erreur ...

Je pense que vous devriez utiliser quelque chose comme (ce qui est mentionné dans le wiki que vous avez lié ci-dessus):

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

Et envelopper la méthode passthru pour déléguer l'action à la méthode privée/protégée appropriée en fonction de la valeur des paramètres [: 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
1
Piotr Mąsior