1

index.html.erbファイル(製品用)を更新する必要がありますが、ページ全体をリロードしません。たとえば、「Sold」という名前の列があり、値は「YES」または「NO」です。そして、これらの値を更新するバックグラウンドrakeタスクがありますが、インデックスファイルを更新して、どの製品が販売されているかをユーザーに表示するようにしたいのです。rakeタスクからそのような変更を呼び出す方法がわかりません。何か助けてください?私が見たajaxとrails3の「チュートリアル」のほとんどは、サーバーからユーザーへの対話ではなく、ユーザーからサーバーへの対話を主に扱っています。

4

2 に答える 2

1

サーバーの更新を取得する方法は多数あります。

  • ポーリング (時々 ajax リクエストを行うための setTimeout)
  • ロング ポーリング (Facebook が使用するもの)
  • コメット (リクエストをブロックし、長いポーリングと同様に定期的に JavaScript を注入している間はリクエストを終了させません)
  • WebSocket (html5 のもの)
  • Flash/Java アプレットなど

通常、単純な数秒ごとのポーリングで十分です。-> (アシキャスト)

ここでは、さまざまな方法の比較を示します。

于 2012-08-28T12:14:32.643 に答える
0

製品のインデックス ページに JavaScript コードを追加して、サーバーに ping を送信し、定期的に (n 秒ごとに) 製品のステータスを取得することをお勧めします。ページに多くの製品がある場合、これは高価な呼び出しになる可能性があります。だから私はあなたにこのようなものを持っているでしょうindex.html.erb

<script type="text/javascript">
  $('document').ready(function() {
    $.ajax({
      method: 'get',
      url : 'products/ping',
      dataType : 'json',
      success: function (json) {
        // iterate through json objects and update their respective sold status
        // on page.
      }
    });
</script>

次に、ビューで更新する製品のステータスと ID を含む JSON オブジェクトで基本的に応答する製品コントローラに ping ルートを追加します。したがって、Ajax 要求が完了して JSON オブジェクトを取得したら、製品を繰り返し処理し、ID に基づいてその製品のステータスを更新します。したがって、製品コントローラーでのアクションは次のようになります。

# app/controllers/products_controller.rb
def ping
  respond_to do |format|
    products_sold_statuses = {}
    format.json do
      Products.all.each do |product|
        # add product sold status and probably id to products_sold_statuses
      end
      render :json => product_sold_statuses, :layout => false
    end
  end
end

そのコードはテストされていないため、ソリューションを構築する際のベースとして使用してください。また、JQuery を使用していることも前提としています。

于 2012-08-28T12:15:57.090 に答える