为Rails实现轮询前端调用更新

时间:2015-08-11 21:20:43

标签: javascript ruby-on-rails ruby view polling

我想实现一个我的“显示”系统。查看,每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>

1 个答案:

答案 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更简单。

此解决方案的工作方式:

  1. 您请求show视图,服务器使用html,js和css文件进行响应。
  2. 轮询开始,每10秒钟将一个请求发送到模拟#update(模拟控制器/更新操作)。您可以更新并保存模拟并返回新值。
  3. 在jquery的ajax.done中,您可以获得新数据,并且可以更新客户端数据。
  4. 希望它有所帮助,

    圣地亚哥