2017-09-10 7 views
0

バックグラウンドで大きなレポートファイルを生成する必要があります。ここには、OrderReportオブジェクトを作成するための簡単なビューがあります。RailsアプリケーションでコントローラからjsにIDを送る方法

<%= simple_form_for order_report, remote: true do |f| %> 
    <%= f.input :start_date, as: :date, html5: true %> 
    <%= f.input :end_date, as: :date, html5: true %> 
    <%= f.submit "Generate report", id: "test" %> 
<% end %> 

とコントローラで何が起こっているのかその:

def create 
    order_report = OrderReport.new(order_report_params) 
    order_report.user = current_user 
    order_report.save 

    OrderReportJob.new(order_report).delay.perform 

    render nothing: true 
end 

ユーザーの後、このアクションは、レポートを生成するために、バックグラウンド・プロセスを作成し、送信ボタンをクリックしてください。私はこのバックグラウンドジョブのステータスをチェックするためにエンドポイントを書きました。このjsがこれはJSスクリプトの一部である

$.ajax({ 
     url: report_url, 
     success: function(report) { 
     if(report.status === 'progress') { 
      $("#spin").show(); 
      $interval = setInterval(checkStatus, 3000); 
     } 
     } 
    }); 

#test idで湖底を提出するonclick機能です。それはうまくいきますが、作成したIDをこのjsファイルに送信する最後のステップはOrderReportです。あなたはJSスクリプトで見ることができるように私が持っているreport_url変数 - それは、すでにハードコードと

var report_url = '/order_reports/1' 

だから主なアイデアはそれが可能だ場合、作成したOrderReportのIDをキャッチすることですように見える、とJSでそれを使用していますスクリプト。どうすればそれを正しく渡すことができますか?

更新:

def create 
    order_report = OrderReport.new(order_report_params) 
    order_report.user = current_user 

    respond_to do |format| 
    if order_report.save 
     OrderReportJob.new(order_report).delay.perform 
     format.json { head :created, location: order_report } 
    else 
     format.json { head :unprocessable_entity } 
    end 
    end 
end 

head :created, location: order_reportが返されます。より多くのRESTfulなソリューションが要求に何が起こったのか、クライアントに伝えるために、意味のある応答コードを使用することです

order_report.js

$(function() { 
    $('#test').click(function() { 
    var report_url = '/order_reports/39' 

    $.ajax({ 
     url: report_url, 
     success: function(report) { 
     if(report.status === 'progress') { 
      $interval = setInterval(checkStatus, 3000); 
     } 
     } 
    }); 

    function checkStatus() { 
     $.ajax({ 
     url: report_url, 
     success: function(report) { 
      if(report.status === 'done') { 
      clearInterval($interval) 
      } 
     } 
     }); 
    } 
    }); 
}); 
+0

あなたがjson'をレンダリング '試してみて、その時点でのレポートのIDを渡すことがありますか? –

答えて

1

201 - Createdレスポンスには、作成したリソースへのURLを含むlocationヘッダーが含まれています。

これはRailsのUJS ajax:success and ajax:error eventsのために聞くことができます:

<%= simple_form_for order_report, remote: true, html: { class: 'order_report_form', 'data-type' => 'json'} do |f| %> 
    <%= f.input :start_date, as: :date, html5: true %> 
    <%= f.input :end_date, as: :date, html5: true %> 
    <%= f.submit "Generate report", id: "test" %> 
<% end %> 

$(document).on('ajax:success', '.order_report_form', function(e, data, status, xhr){ 
    function checkStatus(url) { 
    return $.getJSON(url).then(function(data) { 
     // some logic here to test if we have desired result 
     if (!desiredResult) { 
     // never use setInterval with ajax as it does not care 
     // if the previous request is done. 
     // instead use setTimeout with recursion 
     setTimeout(1000, function(){ checkStatus(url) }); 
     } else { 
     // do something awesome 
     } 
    } 
    } 
    checkStatus(xhr.getResponseHeader('location')); 
}); 

$(document).on('ajax:error', '.order_report_form', function(){ 
    alert("Oops"); 
}); 
+0

回答ありがとう、位置情報付きヘッダーが動作します。しかし、私はまだjsの場所をキャッチすることはできません。 3秒遅れで状態を確認するために、jsファイル全体の回答を更新しました。 Uさんは私のjsに応じて答えを更新することはできますか? –

関連する問題