我花了好几个小时来查看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.erb(对于welcome.rb)
<h1>Hi there</h1>
<p><%= $client.user %></p>
它应该只返回我的用户详细信息,因为我已经将所有我的auth密钥直接输入到配置文件中(稍后我会在我开始工作后抽象它们)。
非常感谢
答案 0 :(得分:0)
你要问自己的第一件事就是为什么你想要在视图中使用实际的twitter客户端方法,这似乎是表面上糟糕的架构决策。很难想象没有更好的方法来组织你的app,所以这不是必需的。
回答你的问题虽然可行的是创建一个客户端对象作为实例变量并将其传递给视图并有一个帮助器,它包含了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客户端方法的结果作为实例变量发送到视图中并在那里显示。过度耦合您的视图和外部系统方法是一种代码味道和一个坏主意