2

インデックスに表示する新しいツイートを作成しようとしていますが、ページを離れたくありません。私のアプリの望ましい機能は、つぶやきストリームからつぶやきを追跡し、その情報を自動的につぶやきオブジェクトに渡し、db に保存することです。

コントローラ:

class TweetsController < ApplicationController

  TWITTER_COMSUMER_KEY = "GfqdzJKb5kIyEnYlQuNGlg"
  TWITTER_CONSUMER_SECRET = "A3Fe0IvDbhlKgowCVmV1WVLlcdYgQ8w9clrDSegCQ"
  TWITTER_OATH_TOKEN = "34012133-caUYq3eiNC7Z9L9KvTgG51VgyctqVxkXP0tKIXDk0"
  TWITTER_OATH_TOKEN_SECRET = "DSLA3F8BPssyEeEP2wZgQ1OJRL5kIVPZfON4GYZFw"

  TweetStream.configure do |config|
    config.consumer_key = TWITTER_COMSUMER_KEY
    config.consumer_secret = TWITTER_CONSUMER_SECRET
    config.oauth_token = TWITTER_OATH_TOKEN
    config.oauth_token_secret = TWITTER_OATH_TOKEN_SECRET
  end

  def index
    @tweets = Tweet.all
  end

  def new
    @tweet = Tweet.new
  end

  def create
    TweetStream.track('bed', 'morning', 'breakfast') do |status|

      temp = status.text
      if(temp.include? "http")
         @tweet = Tweet.new(status.text)
         if @tweet.save
         else
           render "new"
         end
      end
    end
  end

  def show

  end
end

Index.html.erb

<h1>Tweet Tracker</h1>

<% @tweets.each do |tweet| %>
    <p><%= tweet.content %></p>
    <hr />
<% end %>
4

2 に答える 2

1

これは、RESTfulリソース構造(インデックス/表示/作成/編集/破棄)への興味深いアプローチであり、ユーザー入力ではなく自動トラッカーを使用して作成を行います。問題は、コントローラーコードがPOSTリクエストによってアクセスされた場合にのみ実行されることです(routes.rbをいじって他の何かに応答させる場合を除く)。

私の頭の中で最もクリーンな解決策は、定期的にデータをコントローラーに投稿して結果を表示するコーヒースクリプトを作成することです。

/app/assets/javascripts/tweets.js.coffee

$ ->
    setInterval ->
      $.post("/tweets", "", (html)->
            $("#tweets").append html)
     , 1000

/app/views/tweets/create.html.erb

<p><%= @tweet.content %></p>
<br/>

これを正しく機能させるには、ツイート領域をid="tweets"でdivにラップする必要があります。

/app/views/tweets/index.html.erb

<h1>Tweet Tracker</h1>

<div id="tweets">
<% @tweets.each do |tweet| %>
   <p><%= tweet.content %></p>
   <br/>
<% end %>
</div>

render "new"また、コントローラーのcreateメソッドを。に置き換えることもできますreturn。このように、データベースへの保存が失敗しても何もレンダリングされず、すべてがエラーなしで続行されます。

于 2013-03-14T03:25:48.067 に答える
1

これには 2 つの大きな部分があります。

  • ストリーミング API のリッスンとオブジェクトの作成
  • 新しいオブジェクトが作成されたときにユーザーのビューを更新する

2 番目のビットは、@AustinMullins の回答のように、いくつかの単純な JavaScript ポーリングによって実行できます。

最初のビットはコントローラーで行うべきではありません- それらはリクエストに応答するためのものであり、その種類のジョブから逸脱すると、予期しない動作やパフォーマンスの問題が発生する可能性があります。

たとえば、Phusion Passenger で実行されているサイトでは、サーバーがリクエストを処理するためのスレッドを作成し、それが自動的に終了しない場合、一定時間後にスレッドを強制終了することがわかりました。コントローラーが終わりのない入力ストリームをリッスンし始めた場合。

代わりに、コマンド ラインから開始できる別のスクリプトを取得する必要があります。私が使用しているものに似た例を次に示します。

スクリプト/tracker.rb

#!/usr/bin/env ruby
ENV["RAILS_ENV"] ||= "production"
require File.dirname(__FILE__) + "/../config/environment"
TweetStream.configure do |config|
  config.consumer_key = TWITTER_COMSUMER_KEY
  config.consumer_secret = TWITTER_CONSUMER_SECRET
  config.oauth_token = TWITTER_OATH_TOKEN
  config.oauth_token_secret = TWITTER_OATH_TOKEN_SECRET
end

client = TweetStream::Client.new
client.track(*Keyword.pluck(:name)).each do |status|
  Tweet.create(status.text)
end

スクリプト/tracker_ctl

#!/usr/bin/env ruby
require 'rubygems'
require 'daemons'
Daemon.new('tracker.rb')

script/tracker_ctl startこれで、サーバーに ssh してorを実行できますscript/tracker_ctl stop。しかし、おそらくやりたいことは、代わりにコントローラー アクションにこれらのコマンドを発行させることです。

于 2013-03-14T05:48:04.660 に答える