2016-08-16 2 views
0

J'essaie de permettre aux utilisateurs de se connecter via Twitter, mais je reçois l'erreur: Erreur de type dans SessionsController. Je reçois cette erreur chaque fois que je suis redirigé vers: https://api.twitter.com/oauth/authenticate afin que l'utilisateur peut être authentifié. Je devrais être redirigé vers la page Twitter "Authorize App" après avoir été authentifié, mais je reçois l'erreur complète: "TypeError dans SessionsController # create: exception classe/object expected". J'utilise le omniauth_twitter et conçois des gemmes pour cette fonctionnalité. Ai-je manqué quelque chose que je dois faire pour concevoir dans le fichier routes.rb éventuellement?TypeError dans SessionsController # créer lorsque vous essayez de vous connecter à partir de Twitter API utilisant omniauth

De même, il passe par la méthode create (dans le SessionController) car il finit par rediriger vers la page racine, mais je ne vois pas l'utilisateur créé dans la base de données.

Controller Session

class SessionsController < ApplicationController 

def create 
    @user = User.find_or_create_from_auth_hash(auth_hash) 
    session[:user_id] = @user.id 
    redirect_to root_path 
end 

protected 

def auth_hash 
    request.env['omniauth.auth'] 
end 
end 

Modèle utilisateur

class User < ActiveRecord::Base 
devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

before_create :generate_auth_token 

def self.find_or_create_from_auth_hash(auth_hash) 
user = where(provider: auth_hash.provider, uid: auth_hash.uid).first_or_create 
user.update(
    name: auth_hash.info.name, 
    avatar: auth_hash.info.image, 
    token: auth_hash.credentials.token, 
    secret: auth_hash.credentials.secret) 
user 
end 

def generate_auth_token 
loop do 
    self.auth_token = SecureRandom.base64(64) 
    break unless User.find_by(auth_token) 
end 
end 
end 

routes.rb

Rails.application.routes.draw do 
    get 'auth/:provider/callback', to: 'sessions#create' 

    resources :tweets 

    get 'signup/new' 

    get 'signup/create' 


    devise_for :users 


    resources :contacts 
    end 

également l'utilisateur n'affiche dans la base de données, il doit être enregistré vers le bas

Loading production environment (Rails 4.2.1) 
[1] pry(main)> User.all 
User Load (3.2ms) SELECT "users".* FROM "users" 
=> [] 

Répondre

0

Vous voyez cette erreur parce que 1) vous soulevez une exception dans SessionsController # créer (raise :test) et 2) est raise ne pas attendre un symbole, c'est pourquoi vous voyez ce message d'erreur cryptique.

λ irb 
2.3.1 :001 > raise :test 
TypeError: exception class/object expected 
     from (irb):1:in `raise' 
     from (irb):1 
     from /home/peter/.rvm/rubies/ruby-2.3.1/bin/irb:11:in `<main>' 

Vous devez supprimer l'appel à augmenter si elle est pas vraiment censé être là ou, si elle est, appelez raise avec un argument légitime (chaîne, instance d'exception, etc.) et rescue en conséquence.

+0

Merci pour votre réponse. Oui, j'ai essayé cela plus tôt et l'ai retiré, mais il n'a pas encore économisé l'utilisateur dans la base de données. Quand je suis allé à la console de rails je ne vois même pas l'utilisateur dans le mon modèle d'utilisateur: Chargement environnement de production (rails 4.2.1) [1] pry (principal)> User.all Charge d'utilisateur (3.2ms) SELECT "users". * FROM "users" => [] – SaintClaire33

+0

Est-ce que c'est possiblement avec Devise? – SaintClaire33

+0

Je ne suis toujours pas redirigé vers la page d'autorisation de Twitter. Quelqu'un peut-il nous éclairer? – SaintClaire33