1

RailsでAJAXを作成している問題について、誰かが私を助けてくれるかどうか疑問に思っていました。簡単なことを試してみたいのですが、インデックスビューで新しいエントリがないか常に確認したいのですが、画面外で発生しますか?

数秒ごとに、新しいエントリがフェードインするだけで本当にクールになりますか?新しいエントリは、imageというdivクラス内にあり、その中には次のようなものがあります。

<%= image_tag image.image_url(:medium).to_s %>

私はいくつかのチュートリアルを試しましたが、いくつかは私が達成しようとしていることから少し古くなっているようです。誰かが正しい方向に私を助けてくれることを願っています。

4

1 に答える 1

6

基本的な考え方は次のとおりです。

  1. data-属性など、JavaScriptにアクセスできる方法でロードされた最新のエントリを保存します
  2. 遅延してajax呼び出しをループします
  3. ajax呼び出しの応答により、DOMに変更が加えられます

1

ビュー(images / index.html.erb):

<% render @images %>

ビュー(images / _image.html.erb):

<div class="image" data-id="<%=image.id%>">
  <%= image_tag image.image_url(:medium).to_s %>
</div>

2

Javascript:

function poll(){
  latest_id = $('div.image:first').data('id')
  $.getScript('/images?latest_id='+latest_id)
}

$(function(){setInterval(poll, 5000})

3

コントローラ:

@images = Image.order('id desc')
@images = @images.where('id > ?', params[:latest_id]) if params[:latest_id]

ビュー(images / index.js.erb):

$('div.image:first').before('<%=j render @images%>').hide().fadeIn()

モデル名とパスについていくつかの仮定をしていることに注意してください。必要に応じてパスを変更する必要があります。

この例は説明を目的としたものであり、実際のアプリケーションには適していません。サーバーが過負荷になると、JavaScriptがリクエストを処理し続けるか、最初のページに最初のエントリがない場合、新しいエントリの挿入方法が壊れます。

于 2013-03-14T01:01:10.363 に答える