我看到这篇关于这个问题的帖子: Auto Refresh a Html table every x seconds
现在,我正在使用rails,我想做同样的事情,但我想告诉rails我想要一个远程页面,我不希望它加载整页。 我想要的只是模拟:remote =>使用ajax的真实动作。 我已经尝试了常规的ajax,rails会加载整个页面,而不仅仅是我想要的相关内容。
我该怎么做?
答案 0 :(得分:6)
您的代码应该是这样的:
Your controller
def your_action
# your code goes here
end
(your_action.js.erb)
$("#div_id").html("<%= escape_javascript reder :partial => "your_partial_for_table" %>")
your_action.html.erb
<div id="div_id">
<%= render :partial => "your_partial_for_table" %>
</div>
_your_partial_for_table.html.erb
#your table goes here
<script>
$(function() {
$(document).ready(function() {
setInterval(function() {
jQuery.ajax({
url: "<path to your_action>",
type: "GET",
dataType: "script"
});
}, 30000); // In every 30 seconds
});
});
</script>
答案 1 :(得分:2)
服务器已发送事件
您可能希望使用Server Sent Events (from HTML5):
服务器发送事件(SSE)是一种用于浏览器获取的技术 通过HTTP连接从服务器自动更新。服务器已发送 事件EventSource API由W3C标准化为HTML5 1的一部分。
这基本上启动了一个名为ajax long-polling的东西,这是你的JS每隔一秒或几秒钟“ping”一个特定的URL。 然后,Ajax轮询请求将从服务器返回特定响应,允许您按需使用
-
<强>布局强>
我会这样做:
#app/assets/javascripts/application.js
var source = new EventSource('path/to/your/endpoint');
source.addEventListener('message', function(e) {
//do something here
}, false);
#app/controllers/your_controller.rb
Class YourController < ApplicationController
include ActionController::Live
def your_action
response.headers['Content-Type'] = 'text/event-stream'
sse = Reloader::SSE.new(response.stream)
begin
sse.write(last_updated, event: 'results')
rescue IOError
# When the client disconnects, we'll get an IOError on write
ensure
sse.close
end
end
end
这里的诀窍是SSE使用他们自己的内容类型 - text/event-stream
来接收&amp;解析所需的数据。将其与管理典型HTTP协议的标准mime
类型进行比较
I used this url for reference - 然后您可以在从服务器返回时操作文本!
答案 2 :(得分:0)
/* with jQuery */
jQuery(documenta).ready(function() {
setTimeout(function() {
jQuery('.table').load(...);
, 5000);
});
# with rails, determine if it is a ajax request
if request.xhr?
# respond to Ajax request
else
# respond to normal request
end