我花了几个小时看stackoverflow,找不到关于如何在视图文件中调用twitter gem方法的简单解释。我有一个非常简单的rails设置,使用以下文件,并将twitter api客户端设置为全局变量,以便对此进行测试。它在rails控制台工作,但我不能让它在rails中工作。我得到的错误是undefined method "followers" for nil:NilClass
配置初始化/twitter.rb
require 'twitter'
$client = Twitter::REST::Client.new do |config|
config.consumer_key = 'xxxx'
config.consumer_secret = 'xxxx'
config.access_token = 'xxxx'
config.access_token_secret = 'xxxx'
end
welcome_controller.rb
class WelcomeController < ApplicationController
def index
end
end
routes.rb
Rails.application.routes.draw do
get 'welcome/index'
root 'welcome#index'
end
index . html。动词(for welcome.rb)
<h1>Hi there</h1>
<p><%= $client.user %></p>
它应该只是返回我的用户详细信息,因为我已经硬输入了我所有的认证密钥直接到配置文件(我将抽象这些稍后一旦我得到这个工作)。
多谢
您应该问自己的第一件事是为什么要在视图中使用实际的twitter客户端方法?从表面上看,这似乎是一个糟糕的架构决策。很难想象没有更好的方式来组织你的应用程序,这样就不需要了。
回答你的问题,虽然什么可以工作是创建一个客户端对象作为一个实例变量,并传递给视图,并有一个助手封装twitter客户端方法,并在视图中调用它们;见下文.
class WelcomeController < ApplicationController
require 'twitter'
def index
@client = Twitter::REST::Client.new do |config|
config.consumer_key = 'xxxx'
config.consumer_secret = 'xxxx'
config.access_token = 'xxxx'
config.access_token_secret = 'xxxx'
end
end
end
#app/helper/welcome.rb
module WelcomeHelper
def welcome_tweet(twitter_client, message)
twitter_client.send_tweet(message)
end
end
我认为一个更好的解决方案是将twitter客户端方法的结果作为实例变量发送到视图中,并在那里显示它们。将视图与外部系统方法过度耦合是一种代码气味,也是一个坏主意