我想实现一个我的“显示”系统。查看,每10秒钟将调用控制器中的更新,然后异步更新视图而不刷新页面。
我在它异步更新的时候有它。但是我需要进行民意调查。
我的方法是:
控制器show动作用JS响应
def show
@simulation = Simulation.find(params[:id])
end
然后JS做了这样的事情..
`
// starts the polling on page load
$(function() {
setTimeout(callUpdate, 10000);
});
// Continues to poll, making ajax calls
function callUpdate() {
if ($(this).hasClass("update")) {
$.ajax({
type: "PUT",
url: "/simulations/<%= @simulation.id %>"
});
} else {
alert("An error occured updating record.");
}
$('#sim_div').html("<%= j (render @simulation) %>");
setTimeout(callUpdate, 10000);
}
这样做的正确方法是什么?我尝试在资产中使用coffeescript,但是在每个控制器元素上调用它,我尝试将其嵌入到html中或试图将其作为部分包含但我要么在渲染ruby代码时遇到问题我也需要,或者没有足够的访问权限,我已经尝试过respond_to
但它只给了我html。谁能帮我解决这个问题?
编辑:
以下是我的展示视图:
<%= render 'simulation' %>
<%= link_to 'Back', simulations_path %>
和包含的部分:
<div id="sim_div">
<h1><%= @simulation.identifier %></h1>
<h4 class="offset-col-sm-1">Dimensions: <%= @simulation.x_size %>x<%= @simulation.y_size %></h4>
<h4 class="offset-col-sm-1">Verdict: <%= @simulation.verdict %></h4>
<table class="table table-bordered">
<thead>
<tr>
</tr>
</thead>
<tbody>
<% @simulation.state.each do |row| %>
<tr>
<% row.each do |current| %>
<td class="text-center"><%= current %></td>
<% end%>
</tr>
<% end %>
</tbody>
</table>
<br>
</div>
答案 0 :(得分:0)
我的解决方案是:
$.ajax({ method: "PUT", url: $(".some-element").data("url") })
.done(function(data) {
//here you can use the new data
});
更改是你有一个带有类&#34; some-element&#34;的元素。将data-url属性设置为rails为更新路由自动生成的路径。在您的HTML中,您将拥有:
<div class='some-element' data-url="<%= simulations_path(@simulation) %>">
...
</div>
在你的控制器中,你应该将@simulation作为json返回。
此解决方案的其他优点是您可以避免在javascript中嵌入ruby,这意味着服务器会为每个请求发送文件。
投票是正确的,但其他方法是使用网络套接字。在Rails中你有一些宝石可以做到这一点,并且在不久的将来Rails 5将与ActionCable一起出现。无论如何,我会继续进行轮询,因为它比websockets更简单。
此解决方案的工作方式:
希望它有所帮助,
圣地亚哥