0

私は、Ryan Bates が Resque のこのrailscastで持っている設定を複製しようとしています。Ryan Bates は、サード パーティ サービスの Web リクエストをキューに入れ、結果ページを結果で更新します。

私は、ブラウザではなく別のRailsアプリと対話するアプリケーションを設計しており、類似の動作を再現したいと考えています.JSON出力のみが期待されるという重要な違いがあります.

現在、私は次のようなものを持っています: (私のモデルはListsTasks、List has_manyTasks と Task belongs_toa List.

じぶんのlists_controller.rb

def show
  Resque.enqueue(TaskDataFetcher,params[:id])
  # confused if I need to have a render_to below this.

end

task_data_fetcher.rb

require "net/http"
require "uri"

  class TaskDataFetcher
    @queue = :tasks_queue

    def self.perform(id)

      list = List.new(:id => id)
      url = "taskservice.com/" + id + ".json"

      uri = URI.parse(url)
      response = Net::HTTP.get_response(uri)
      task = Task.new(:contents => response.body)
      task.list = list
      # how to return this to the requesting server????
    end
  end
4

2 に答える 2

1

Railscast では、Resque タスクが終了した後、結果が自動的に更新されないことがわかります。彼はページを数回リロードして、showリクエストをやり直す必要があります。したがって、この動作を再現したい場合は、次のようにすることができます。

def show
    list = List.find(params[:id])
    if list
        respond_to do |format|
            format.json {render :json => list.to_json}
        end
    else
        Resque.enqueue(TaskDataFetcher, params[:id])
        render :nothing => true, :status => 202
    end
end
于 2012-08-28T06:00:44.687 に答える
0

Requerement: したがって、ユーザーはサービスにいくつかのタスクを表示するように要求しています。そして、それらを別のサービスから取得する必要がありますtaskservice.com。次に、永続性のためにデータベースを介してこれを行う必要があると思います。

提案:TaskRequest属性を持つ ようなモデルを持つことができます

`id` # must ;)
`task_list` # might be xml or whatever format suits you best
`is_received` # boolean

あなたのshowメソッドでは、TaskRequestエントリを作成し、loadingタイプのものを表示し、ajax を介してタスクを要求するビューをレンダリングします。ajax 応答は、タスク リストとis_received. ただし、is_receivedコンテンツに納得したら、もう一度リクエストする必要があります。

並行して、TaskDataFetcher2 つの を受け取る必要がありますid。1 つはあなたが今送っているもので、もう 1 つはTaskRequestid のものです。したがって、サービスからデータをフェッチした後、それをTaskRequestテーブルに保存し、 を に更新is_recievetrueます。true に設定すると、最終的にこのデータのリクエストがオフになります。

説明全体が少し曖昧に見えるかもしれません。あなたが何もしなかった場合、または他に何か特別なものが必要な場合はお知らせください。

注:これは、SO が質問に答えているときにコードの書式を表示する方法のようなものです ;)

于 2012-08-28T05:27:09.940 に答える