2013-10-08 112 views
0

我在用户模型中存储用户的Twitter访问令牌时遇到了一些麻烦。我已按照Railscast #241安装了Omniauth宝石,并成功设置了Twitter身份验证,存储了“uid”和“name”。为了进行认证的Twitter API调用,我想存储用户的访问令牌和访问令牌密钥,并因此创建了一个迁移来创建这些字段。我成功地做到了这一点,并且可以在Rails控制台中成功地将这些字段分配给没有存储的记录。但是,当尝试验证新用户时,从一开始就提取这些信息,我会在标题中看到错误。下面是其他错误信息:SessionsController中的NoMethodError#create - 未定义的方法'[]'为#<Oauth :: Access_Token ...>

app/models/user.rb:13:in `block in create_from_omniauth' 
app/models/user.rb:10:in `create_from_omniauth' 
app/models/user.rb:6:in `from_omniauth' 
app/controllers/sessions_controller.rb:5:in `create' 

我跟着下来从会话控制器到用户模式这条道路,但无法弄清楚是什么原因造成的错误。我在下面列入了这些文件。

会话控制器 类SessionsController < ApplicationController的

def create 
    user = User.from_omniauth(env["omniauth.auth"]) 
    session[:user_id] = user.id 
    redirect_to root_url, notice: "Signed in" 
end 

def destroy 
    session[:user_id] = nil 
    redirect_to root_url, notice: "Signed out" 
end 

end 

用户模型

class User < ActiveRecord::Base 
    attr_accessible :name, :uid, :access_token, :access_token_secret 
    has_many :events 

    def self.from_omniauth(auth) 
    where(auth.slice('uid')).first || create_from_omniauth(auth) 
    end 

    def self.create_from_omniauth(auth) 
create! do |user| 
    user.uid = auth["uid"] 
    user.name = auth["info"]["nickname"] 
     user.access_token = auth["extra"]["access_token"]["token"] 
     user.access_token_secret = auth["extra"]["access_token"]["secret"] 
    end 
    end 

end 

谁能帮我解决这个问题?我知道它与在create_from_omniauth方法中设置access_token字段有关,因为没有它们就可以正常工作。我一直在试图弄清楚为什么这些行不通。预先感谢您的帮助。

回答

0

我怀疑你为什么需要保存这些令牌,因为他们看起来没用。在这种情况下,最重要的是Twitter返回的uid用于识别或创建用户。

无论如何,你错误的原因是没有这样的密钥。

auth['extra']['access_token']是一个字符串,没有更多的子键。

:extra => { 
    :access_token => "", # An OAuth::AccessToken object 

要访问tokensecret,您可以使用auth['credentials']

:credentials => { 
    :token => "a1b2c3d4...", # The OAuth 2.0 access token 
    :secret => "abcdef1234" 
}, 

参考:

+0

非常感谢您帮助我解决问题! – dannymorty

相关问题