2015-10-20 16 views
6

は、私がページをレンダリングした後、リモートサービスのリクエストを行う必要がありレンダリング後にメソッドを呼び出す方法は?

私のコントローラ:私はテンプレートがされた後

+0

なぜこのようにする必要があるのか​​分かりませんか?あなたはなぜ後に呼び出される必要があるのか​​について、より多くの背景を与えることができますか?ページがクライアント側でレンダリングされた後、このアクションをトリガーするjs経由でapi呼び出しを行うことができます。 – penner

+0

リモートサーバーでリクエストするには時間がかかります。たとえば、バックグラウンドでこのアクションを呼び出す必要があります。twitter apiを使用してツイートを送信する –

答えて

9

after_filterが実行されているページをレンダリングした後remote_actionメソッドを呼び出す必要が

after_filter :remote_action, only: :update 

def update 
    @res = MyService.do_action foo, bar 
    return render json: @res[:json], status: @res[:status] unless @res[:success] 
end 

def remote_action 
    # There is remote http request 
end 

htmlに変換されますが、クライアントに応答としてhtmlが送信されるより前にはとなります。したがって、リモートHTTPリクエストを作成するような処理が遅い場合は、リモートリクエストが完了するのを待つ必要があるため、応答が遅くなります。つまり、リモートリクエストが応答をブロックします。

ブロッキングを回避するには、別のスレッドをフォークしできます。これを使用して

https://github.com/tra/spawnling

を見て、あなただけの

def remote_action 
    Spawnling.new do 
    # There is remote http request 
    end 
end 

リモート呼び出し意志にあなたのコードを変更します応答が返される前に引き続きトリガーされますが、新しいスレッドにフォークされているため、応答はリモート要求が戻ってくるのを待たずにただちに実行されます。

https://github.com/collectiveidea/delayed_jobを見ることもできます。https://github.com/collectiveidea/delayed_jobは、ジョブをデータベーステーブルに入れ、別のプロセスがジョブを取り出して実行します。

+0

ありがとうございました!出来た! –

+0

素晴らしい!私の答えを正しいものとして自由に記入してください:) –

関連する問題