Ruby Twitter gem 关注者方法重复 20 次而不是显示前 20 位关注者
Ruby Twitter gem followers method repeating 20 times rather than displaying first 20 followers
所以我将 ruby 推特 gem 和 api 与 omniauth 结合使用,通过一个简单的 rails 应用程序登录推特,并且 return 用户的前20个关注者。执行此操作的主要代码是 lib 文件中的一个方法,其中说明:
def followers
client.followers.take(20)
end
出于某种原因,该应用程序在本地运行完美,但在部署到 heroku 后,它显示我的第一个关注者,重复 20 次,而不是前 20 个关注者。任何帮助,将不胜感激。这是我的代码:
我在 rails 中有一个基本的 Twitter api 应用程序,它在本地运行得很好,但是当我推送到 Heroku 时它不起作用,并且在检查日志时有一个错误说 uninitialized constant WelcomeController::TwitterApi
。我不知道如何纠正这个问题。非常感谢。
lib/twitter_api.rb
class TwitterApi
def initialize(user)
@user = user
end
def our_public_tweets
client.user_timeline(user, count: 1, exclude_replies: true, include_rts: false)
end
def followers
client.followers.take(20)
end
private
attr_reader :user
def client
@client ||= Twitter::REST::Client.new do |config|
config.consumer_key = Rails.application.secrets.twitter_api_key
config.consumer_secret = Rails.application.secrets.twitter_api_secret
config.access_token = user.token
config.access_token_secret = user.secret
end
end
end
application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
# to enable the current_user variable to be used in the view file
helper_method :current_user
end
welcome_controller.rb
class WelcomeController < ApplicationController
require 'twitter_api'
def index
@twitter_api = TwitterApi.new(current_user)
end
end
views/welcome/index.html.erb
<div class="wrapper">
<h1>OMNIAUTH AND TWITTER API</h1>
<!-- <%= link_to "Sign in with Twitter", "/auth/twitter" %> -->
<% if current_user %>
<div id="sign_in_wrapper">
<p id="sign_in">Signed in as <span><%= current_user.name %></span> </p>
<%= image_tag current_user.profile_image, class: "profile_image" %>
<p><%= link_to "Sign out", signout_path, id: "sign_out" %></p>
</div>
<div class="public_tweets">
<p>Latest tweet from <%= current_user.name %>:</p>
<% @twitter_api.our_public_tweets.each do |tweet| %>
<% cache('our_public_tweets', expires_in: 6.hours) do %>
<%= parsed_tweet(tweet) %>
<% end %>
<% end %>
</div>
<ul class="followers">
<p>First 20 followers for <%= current_user.name %>:</p>
<% @twitter_api.followers.each do |follower| %>
<% cache('followers', expires_in: 6.hours) do %>
<li><%= follower.name %></li>
<hr>
<% end %>
<% end %>
</ul>
<% else %>
<%= link_to "/auth/twitter", id: "link_button" do %>
<i class="fa fa-twitter fa-3x"></i>
<% end %>
<p class="date">Click the twitter icon to sign in and view followers</p>
<% end %>
</div>
models/user.rb
class User < ApplicationRecord
def self.from_omniauth(auth_hash)
#Look up the user or create them using keys in the auth hash
user = where(provider: auth_hash.provider, uid: auth_hash.uid).first_or_create
user.update(
name: auth_hash.info.name,
profile_image: auth_hash.info.image,
twitter_user_name: auth_hash.info.nickname,
token: auth_hash.credentials.token,
secret: auth_hash.credentials.secret
)
user
end
# token and secret is what came back from omniauth and this was saved to the user database.
end
application_helper.rb
module ApplicationHelper
def parsed_tweet(tweet)
_parsed_tweet = tweet.text.dup
tweet.urls.each do |entity|
html_link = link_to(entity.display_url.to_s, entity.expanded_url.to_s, target: 'blank')
_parsed_tweet.sub!(entity.url.to_s, html_link)
end
tweet.media.each do |entity|
html_link = link_to(entity.display_url.to_s, entity.expanded_url.to_s, target: 'blank')
_parsed_tweet.sub!(entity.url.to_s, html_link)
end
_parsed_tweet.html_safe
end
end
有你的问题,缓存不正确。
<% cache('followers', expires_in: 6.hours) do %>
<li><%= follower.name %></li>
<hr>
<% end %>
当缓存为空时,您无法通过关键字找到任何内容"followers"。您获取第一个关注者并使用该密钥将其缓存。当您显示第二个关注者时,已经有一个可用的缓存条目,因此您使用的是缓存,而不是第二个关注者的数据。
你的其他块也有同样的问题。我认为你的意思是缓存整个循环,而不是单个元素。
For some reason, the app works perfectly locally
因为在本地你有 :null
cache_store,我想。
所以我将 ruby 推特 gem 和 api 与 omniauth 结合使用,通过一个简单的 rails 应用程序登录推特,并且 return 用户的前20个关注者。执行此操作的主要代码是 lib 文件中的一个方法,其中说明:
def followers
client.followers.take(20)
end
出于某种原因,该应用程序在本地运行完美,但在部署到 heroku 后,它显示我的第一个关注者,重复 20 次,而不是前 20 个关注者。任何帮助,将不胜感激。这是我的代码:
我在 rails 中有一个基本的 Twitter api 应用程序,它在本地运行得很好,但是当我推送到 Heroku 时它不起作用,并且在检查日志时有一个错误说 uninitialized constant WelcomeController::TwitterApi
。我不知道如何纠正这个问题。非常感谢。
lib/twitter_api.rb
class TwitterApi
def initialize(user)
@user = user
end
def our_public_tweets
client.user_timeline(user, count: 1, exclude_replies: true, include_rts: false)
end
def followers
client.followers.take(20)
end
private
attr_reader :user
def client
@client ||= Twitter::REST::Client.new do |config|
config.consumer_key = Rails.application.secrets.twitter_api_key
config.consumer_secret = Rails.application.secrets.twitter_api_secret
config.access_token = user.token
config.access_token_secret = user.secret
end
end
end
application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
# to enable the current_user variable to be used in the view file
helper_method :current_user
end
welcome_controller.rb
class WelcomeController < ApplicationController
require 'twitter_api'
def index
@twitter_api = TwitterApi.new(current_user)
end
end
views/welcome/index.html.erb
<div class="wrapper">
<h1>OMNIAUTH AND TWITTER API</h1>
<!-- <%= link_to "Sign in with Twitter", "/auth/twitter" %> -->
<% if current_user %>
<div id="sign_in_wrapper">
<p id="sign_in">Signed in as <span><%= current_user.name %></span> </p>
<%= image_tag current_user.profile_image, class: "profile_image" %>
<p><%= link_to "Sign out", signout_path, id: "sign_out" %></p>
</div>
<div class="public_tweets">
<p>Latest tweet from <%= current_user.name %>:</p>
<% @twitter_api.our_public_tweets.each do |tweet| %>
<% cache('our_public_tweets', expires_in: 6.hours) do %>
<%= parsed_tweet(tweet) %>
<% end %>
<% end %>
</div>
<ul class="followers">
<p>First 20 followers for <%= current_user.name %>:</p>
<% @twitter_api.followers.each do |follower| %>
<% cache('followers', expires_in: 6.hours) do %>
<li><%= follower.name %></li>
<hr>
<% end %>
<% end %>
</ul>
<% else %>
<%= link_to "/auth/twitter", id: "link_button" do %>
<i class="fa fa-twitter fa-3x"></i>
<% end %>
<p class="date">Click the twitter icon to sign in and view followers</p>
<% end %>
</div>
models/user.rb
class User < ApplicationRecord
def self.from_omniauth(auth_hash)
#Look up the user or create them using keys in the auth hash
user = where(provider: auth_hash.provider, uid: auth_hash.uid).first_or_create
user.update(
name: auth_hash.info.name,
profile_image: auth_hash.info.image,
twitter_user_name: auth_hash.info.nickname,
token: auth_hash.credentials.token,
secret: auth_hash.credentials.secret
)
user
end
# token and secret is what came back from omniauth and this was saved to the user database.
end
application_helper.rb
module ApplicationHelper
def parsed_tweet(tweet)
_parsed_tweet = tweet.text.dup
tweet.urls.each do |entity|
html_link = link_to(entity.display_url.to_s, entity.expanded_url.to_s, target: 'blank')
_parsed_tweet.sub!(entity.url.to_s, html_link)
end
tweet.media.each do |entity|
html_link = link_to(entity.display_url.to_s, entity.expanded_url.to_s, target: 'blank')
_parsed_tweet.sub!(entity.url.to_s, html_link)
end
_parsed_tweet.html_safe
end
end
有你的问题,缓存不正确。
<% cache('followers', expires_in: 6.hours) do %>
<li><%= follower.name %></li>
<hr>
<% end %>
当缓存为空时,您无法通过关键字找到任何内容"followers"。您获取第一个关注者并使用该密钥将其缓存。当您显示第二个关注者时,已经有一个可用的缓存条目,因此您使用的是缓存,而不是第二个关注者的数据。
你的其他块也有同样的问题。我认为你的意思是缓存整个循环,而不是单个元素。
For some reason, the app works perfectly locally
因为在本地你有 :null
cache_store,我想。