基本的な考え方は次のとおりです。
data-
属性など、JavaScriptにアクセスできる方法でロードされた最新のエントリを保存します
- 遅延してajax呼び出しをループします
- 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がリクエストを処理し続けるか、最初のページに最初のエントリがない場合、新しいエントリの挿入方法が壊れます。