2014-05-11 52 views
0

我試圖將我的應用程序與twitter API集成。使用Twitter API的Rails應用程序:未定義的方法`user'for nil:NilClass

這裏是我的步驟:

1:安裝了嘰嘰喳喳的寶石:gem 'twitter

2:抓住this代碼從嘰嘰喳喳的寶石文件並把它放在我的controller內。我也嘗試將代碼放在helper

require 'twitter'

@client = Twitter::REST::Client.new do |config| 
    config.consumer_key = ENV["CONSUMER_KEY"] 
    config.consumer_secret = ENV["CONSUMER_SECRET"] 
    config.access_token  = ENV["ACCESS_TOKEN"] 
    config.access_token_secret = ENV["ACCESS_SECRET"] 
end 

3)註冊我的Twitter的應用程序,並得到了consumer_key (AKA: API key)consumer_secret (AKA:API secret)access_tokenaccess_token_secret

我用config/application.yml來存儲訪問令牌。這是正確的做法嗎?但願如此。我有<%= @client.user.username %>

我正在開發(localhost3000)。我的回調網址是http://127.0.0.1/

我也試圖組織我的代碼爲this answer暗示無濟於事。

我使用Rails 4.0.2

我測試的代碼在console並可以正常使用。我嘗試了幾個查詢,包括上面顯示的一個:<%= @client.user.username %>,他們都在工作。

但是當我發展我的代碼運行我得到這個錯誤:

undefined method `user'` for nil:NilClass. 

我明白什麼錯誤意味着。但@client怎麼可能是零?當我在控制檯中運行它時,它不是零。我忘了什麼嗎?我將不勝感激任何建議。請讓我知道你是否希望我提供更多的信息/代碼。謝謝。

編輯:另外,試圖將上面的代碼以@client開頭移動到config/initializers/twitter.rb。獲取相同的錯誤信息。

回答

0

我試圖通過@Pramod欣德和@Peeyush這裏概述兩種解決方案,但沒有人似乎爲我工作。以下是我如何解決問題。

我需要做的是將method action包裝在我的控制器內部的以下代碼中。就像這樣:

def tweets 
    @client = Twitter::REST::Client.new do |config| 
    config.consumer_key  = ENV["CONSUMER_KEY"] 
    config.consumer_secret  = ENV["CONSUMER_SECRET"] 
    config.access_token  = ENV["ACCESS_TOKEN"] 
    config.access_token_secret = ENV["ACCESS_SECRET"] 
    end 
end 

我創建了一個新的文件,config/application.yml來存儲我twitter API credentials,並將該文件添加到.gitignore,以避免它被致力於爲github。以上代碼使用ENV[]來訪問存儲在config/application.yml中的憑據。

config/application.yml

CONSUMER_KEY: "1234" 
CONSUMER_SECRET: "1234" 
ACCESS_TOKEN: "1234" 
ACCESS_SECRET: "1234" 

這是一個YAML文件。所以要小心縮進。

然後我routes.rb裏面,我創建了一個映射到上述行動路線:

get "/tweets", to: "posts#tweets" 

顯然,如果你想獲取,而不是他們張貼的鳴叫,你必須創建一個POST路線。您也可以考慮將上述操作移至它自己的TweetsController。或者將它封裝在它自己的類中。

要完成的約定,我創建了一個view file其映射到tweets行動:

tweets.html.erb 

爲什麼我收到此錯誤信息的原因:

undefined method `user' for nil:NilClass 

是因爲我沒有有一個route,controller action和一個view file映射到每個。

直到這一點,在development時,一切工作正常。

當我推開應用heroku,我得到了以下錯誤:

ActionView::Template::Error (Unable to verify your credentials): 

解決方法:安裝gem 'figaro'(實際上這種寶石爲您創建config/application.yml文件,並自動追加到.gitignore

要。解決heroku錯誤,你所要做的就是運行:rake figaro:heroku。看到這個​​關於使用figaro gem來保持私有環境變量

1

這可能是因爲您的控制器代碼嘗試從環境變量訪問CONSUMER_KEY等,但是您尚未將其設置爲開發模式。

您可以使用rails_config gem,讓它通過適當的配置在config/中爲您創建settings.yml文件。 現在,存儲你嘰嘰喳喳在其具體情況如下:

twitter: 
    CONSUMER_KEY: 'your_consumer_key_here' 
    CONSUMER_SECRET: 'your_consumer_secret_here' 
    ACCESS_TOKEN: 'your_access_token_here' 
    ACCESS_SECRET:'your_access_secret_here' 

然後,修改控制器代碼使用這些值如下:

account = Settings['twitter'] 

@client = Twitter::REST::Client.new do |config| 
    config.consumer_key  = account["CONSUMER_KEY"] 
    config.consumer_secret  = account["CONSUMER_SECRET"] 
    config.access_token  = account["ACCESS_TOKEN"] 
    config.access_token_secret = account["ACCESS_SECRET"] 
end 

您可以添加settings.yml.gitignore使該文件不是由git提交的。

或者,您可以使用描述的方法Here

如果您想在開發中設置ENV變量,您可以閱讀this

+0

是在'config/settings.yml'還是'config/initilizers/settings.yml'下? –

+0

我將代碼移到了'config/settings.yml',並且在控制器中使用了你的代碼,但是現在我得到了新的錯誤:'未初始化的常量PostsController :: Settings'。任何想法? –

+0

查看更新的答案:) – Peeyush

1

我覺得你的鑰匙都沒有得到正確加載

你的config/settings.yml中應該是這樣的

development: 
    twitter: 
    CONSUMER_KEY: 'your_consumer_key_here' 
    CONSUMER_SECRET: 'your_consumer_secret_here' 
    ACCESS_TOKEN: 'your_access_token_here' 
    ACCESS_SECRET:'your_access_secret_here' 

使此文件根據您的環境

然後加載此爲

def get_twitter_client 
    oauth_config = YAML::load(File.open("#{Rails.root}/config/settings.yml")) 

    @client = Twitter::REST::Client.new do |config| 
    config.consumer_key  = oauth_config[Rails.env]['twitter']["CONSUMER_KEY"] 
    config.consumer_secret  = oauth_config[Rails.env]['twitter']["CONSUMER_SECRET"] 
    config.access_token  = oauth_config[Rails.env]['twitter']["ACCESS_TOKEN"] 
    config.access_token_secret = oauth_config[Rails.env]['twitter']["ACCESS_SECRET"] 
    end 
end 

此外,如果你看牛逼的Twitter寶石@client有方法的用戶(用戶顯示API),它接受user_id說明或TWITTER_USERNAME /手柄/ SCREEN_NAME

+0

嘿謝謝你的答案。 Rails配置是我幾乎不知道的話題。應該''oauth_config = YAML :: load(File.open(「#{Rails.root} /config/settings.yml」))'和下面的代碼塊進入'config/environments'文件夾? –

+0

無論我把這段代碼放在哪裏,我仍然像以前一樣得到同樣的錯誤:'ni的undefined方法用戶:NilClass' –

+0

如果你仍然得到這個錯誤日誌,把這段代碼放在一些模型中,並把它叫做'model_object.get_twitter_client' '@ client.errors'和日誌'oauth_config [Rails.env] ['twitter'] [「CONSUMER_KEY」]'和其他所有鍵看看鍵是否正確加載 –

相關問題