2016-10-16 5 views
0

ルーニーのtwitter gemとapiをomniauthと一緒に使って、シンプルなレールアプリでTwitterにログインし、 。これを行うには、コードの主な作品は述べLIBファイル内のメソッドです:Ruby Twitterのgem followersメソッドは最初の20人のフォロワーを表示するのではなく、20回繰り返します

def followers 
    client.followers.take(20) 
end 

を何らかの理由で、アプリは完全にローカルに動作しますが、Herokuのに配備された後、それは私の最初のフォロワーを表示し、20回繰り返します、最初の20人の信者とは対照的です。どんな助けもありがとう。ここに私のコードです:

私はヘルコにプッシュしたときに、それは動作しませんログをチェックしたときにエラーがuninitialized constant WelcomeController::TwitterApiと言って、レールには、基本的なツイッターAPIアプリを持っています。私はこれを修正する方法を見つけることができません。どうもありがとう。

の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 

class WelcomeController < ApplicationController 

require 'twitter_api' 

    def index 
    @twitter_api = TwitterApi.new(current_user) 
    end 
end 

ビューwelcome_controller.rb /歓迎/ 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 %> 

キャッシュが空の場合、「フォロワー」というキーでは何も見つかりません。最初のフォロワーを受け取り、そのキーでキャッシュします。 2番目のフォロワーを表示するときにはすでに使用可能なキャッシュエントリーがあるので、2番目のフォロワーのデータではなくキャッシュを使用します。

他のブロックにも同じ問題があります。私は個々の要素ではなく、ループ全体をキャッシュすることを意図していたと思います。何らかの理由で

ローカルあなたが:null cache_storeを持っているので、アプリは完全にローカル

の作品、私は思います。

+0

thats great - that thanks!興味のないところから、それはなぜ英雄のために変わったのですか? – sdawes

+0

@sdawes:ローカルにキャッシュが設定されていない可能性があります(ヌルストア) –

関連する問題