Ruby Twitter宝石粉丝方法重复20次而不是显示前20位粉丝

时间:2016-10-16 10:15:55

标签: ruby-on-rails heroku twitter-oauth twitter-gem

所以我使用ruby twitter gem和api以及omniauth,通过一个简单的rails应用程序登录twitter,并返回用户的前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

视图/欢迎/ 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>

模型/ 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

1 个答案:

答案 0 :(得分:1)

存在问题,缓存不正确。

    <% cache('followers', expires_in: 6.hours) do %>
      <li><%= follower.name %></li>
      <hr>
    <% end %>

当缓存为空时,您无法通过密钥&#34;关注者&#34;找到任何内容。你拿第一个跟随者并用该密钥缓存它。当您显示第二个关注者时,已经有一个可用的缓存条目,因此您使用缓存,而不是第二个关注者的数据。

与其他区块相同的问题。我认为你的意思是缓存整个循环,而不是单个元素。

  

出于某种原因,该应用程序在本地完美运行

因为本地你有:null cache_store,我想。