2013-10-08 78 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

相關問題