SessionsController中的Omniauth NoMethodError

时间:2012-05-27 02:13:39

标签: omniauth

您好我正在尝试运行Railscast的#241 - 使用Omniauth进行推特 - 最终使用facebook。我正在尝试制作的应用程序需要Facebook登录,但由于有关于如何使用Twitter登录的视频,不妨先说一下,但我遇到了问题。

我在登录Twitter后不断收到此错误。 “SessionController中的NoMethodError #create” - 未定义的方法`[]'为nil:NilClass。这是相关的代码。

class SessionsController < ApplicationController
    def create
        auth = request.env["omniauth.auth"]
        user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
        session[:user_id] = user.id
        redirect_to root_url, :notice => "Signed in!"
    end
end

我还通过dev.twitter.com设置了网站和回调链接,如下所示: 网站:“http://127.0.0.1:3000” 回调:“http://127.0.0.1:3000/auth/twitter/callback”

配置/初始化程序中的Omniauth.rb:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'
end

(我已经提供了消费者密钥和秘密)

Application.html.erb

<div id="user_nav">
  <%= link_to "Sign in with Twitter", "/auth/twitter" %>
</div>

在routes.rb

中添加了这一行
match "/auth/:provider/callback" => "sessions#create"

User.rb

class User < ActiveRecord::Base
  attr_accessible :name, :provider, :uid

  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["user_info"]["name"]

  end
end

我不知道我哪里出错了

1 个答案:

答案 0 :(得分:1)

好的,我发现了问题。花了我一会儿。

Twitter将“user_info”元素更改为“info” 而不是

user.name = auth["user_info"]["name"] 

它是

user.name = auth["info"]["name"]

接下来要改变的是来自

的会话控制器
session[:user_id] = user.id

session[:user_id] = user.uid