2016-10-16 69 views
0

所以即時通過使用ruby twitter gem和api與omniauth一起,通過簡單的rails應用程序登錄到twitter,並返回用戶的前20名追隨者。代碼來做到這一點的主要部分是在一個lib文件的方法,指出:紅寶石Twitter的寶石追隨者方法重複20次,而不是顯示前20名追隨者

def followers 
    client.followers.take(20) 
end 

出於某種原因,應用程序完美的作品在本地,但之後被部署到Heroku的,它顯示我的第一個追隨者,20次重複,而不是前20名追隨者。任何幫助,將不勝感激。這裏是我的代碼:

我有一個基本的嘰嘰喳喳api應用程序在rails中,它在本地完美地工作,但是當我推到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

還有就是你的問題,不正確的緩存。

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

當緩存爲空時,您找不到關鍵「關注者」的任何內容。你帶第一個跟隨者並用該密鑰緩存它。當你顯示第二個追隨者時,已經有一個可用的緩存條目,所以你使用緩存而不是第二個追隨者的數據。

與您的其他街區相同的問題。我認爲你的意思是緩存整個循環,而不是單個元素。

出於某種原因,應用程序完美的作品在當地

因爲本地您有:null cache_store,我想。

+0

多數民衆贊成在偉大的 - 謝謝你!出於興趣,爲什麼它會改變爲heroku而不是本地 - 緩存只能在生產中工作呢? – sdawes

+0

@sdawes:本地你可能沒有設置緩存(空存儲) –