【问题标题】:Rails app with Twitter API: undefined method `user' for nil:NilClass带有 Twitter API 的 Rails 应用程序:nil:NilClass 的未定义方法“用户”
【发布时间】:2014-05-11 05:54:52
【问题描述】:

我正在尝试将我的应用与 twitter API 集成。

这是我的步骤:

1:安装 twitter gem:gem 'twitter

2:从 twitter gem 文档中获取 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 来存储访问令牌。这是正确的做法吗?但愿如此。

4) 在views,我有<%= @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。得到相同的错误信息。

【问题讨论】:

    标签: ruby-on-rails twitter


    【解决方案1】:

    这可能是因为您的控制器代码试图从环境变量中访问CONSUMER_KEY 等,但您尚未将其设置为开发模式。

    您可以使用rails_config gem 并让它在config/ 中为您创建 settings.yml 文件并进行适当的配置。 ] 现在,将 Twitter 详细信息存储在其中,如下所示:

    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

    【讨论】:

    • config/settings.yml还是config/initilizers/settings.yml下的?
    • 我将代码移至config/settings.yml,并在控制器中使用了您的代码,但现在出现新错误:uninitialized constant PostsController::Settings。有什么想法吗?
    • 感谢所有帮助。我已经安装了gem "rails_config"。仍在阅读文档,试图弄清楚如何使用它。明天我会试着弄清楚。任何关于我如何使用这个 gem 来加载与我的代码相关的环境的指针表示赞赏。谢谢
    【解决方案2】:

    我认为您的密钥没有正确加载

    你的 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 gem @client 有方法 user(user show API) 接受 user_id 或 twitter_username/handle/screen_name

    【讨论】:

    • 嘿,谢谢你的回答。 Rails 配置是一个我几乎一无所知的话题。 oauth_config = YAML::load(File.open("#{Rails.root}/config/settings.yml")) 和后面的代码块应该进入config/environments 文件夹吗?
    • 无论我把这段代码放在哪里,我仍然遇到和以前一样的错误undefined method user for ni:NilClass
    【解决方案3】:

    我尝试了@Pramod Shinde 和@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。或者将其封装在它自己的类中。

    为了完成约定,我创建了一个映射到tweets 操作的view file

    tweets.html.erb
    

    我收到此错误消息的原因:

    undefined method `user' for nil:NilClass
    

    是因为我没有映射到每个的 routecontroller actionview file

    到目前为止,在development 中一切正常。

    当我将应用推送到heroku 时,出现以下错误:

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

    解决方案:安装gem 'figaro'(实际上这个gem会为你创建config/application.yml文件并自动附加到.gitignore

    要解决heroku 错误,您只需运行:rake figaro:heroku。有关使用 figaro gem 保持环境变量私有的信息,请参阅此 tutorial

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多