我试图让用户通过Twitter登录,但我得到错误:在SessionsController类型错误。每当我被重定向到:https://api.twitter.com/oauth/authenticate以便对用户进行身份验证时,我都会得到这个错误。我应该被重定向到Twitter"授权应用程序"页面经过身份验证后,但我收到完整的错误:"类型错误在SessionsController#创建:异常类/对象预期"。我正在使用omniauth_twitter并为该功能设计gem。我是否错过了一些我需要为路线设计的东西。可能是Rb文件吗?
它也使它通过创建方法(在SessionController),因为它最终重定向到根页面,但我没有看到在数据库中创建的用户。
<<p> 会话控制器/strong> 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
用户模型
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
同时用户没有显示在数据库中,应该保存
Loading production environment (Rails 4.2.1)
[1] pry(main)> User.all
User Load (3.2ms) SELECT "users".* FROM "users"
=> []
你看到这个错误是因为1)你在sessionscontroller# create (raise :test
)和2)raise
不期望一个符号,这就是为什么你看到这个神秘的错误消息。
λ 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>'
如果它实际上不应该在那里,您应该删除调用以引发,或者,如果它在那里,则使用合法的参数(字符串,异常实例等)调用raise
和相应的rescue
。