如何使用ActionController :: Live从数据库表流?

时间:2014-02-10 01:30:30

标签: javascript ruby-on-rails ruby-on-rails-4 real-time actioncontroller

设置:在我的环境中,Java程序每秒都会连续写入名为readings的PostgreSQL数据库表。

我正在构建一个连接到同一数据库并显示这些读数的rails应用程序。这是静态显示读数的图片。

问题:要查看新的阅读材料,我必须刷新。

enter image description here

问题:如何使用ActionController :: Live使此页面显示新记录?我想我需要轮询数据库以获取新记录并更新@readings变量,但我不知道如何。

这是readings_controller.rb的开头。

class ReadingsController < ApplicationController                                    
  include ActionController::Live                                                    

  before_action :set_reading, only: [:show, :edit, :update, :destroy]               

  # GET /readings                                                                   
  # GET /readings.json                                                              
  def index                                                                         
    @search = Reading.search(params[:q])                                            
    @readings = @search.result.order('time DESC').paginate(:page => params[:page])
  end 

1 个答案:

答案 0 :(得分:0)

ActionController::Live是自己的野兽

您无法像普通控制器/操作一样使用它 - 它必须与SSE'sweb sockets一起使用才能提供连接。我不相信你可以在没有永久连接的情况下让它工作

Excellent resource


<强>的ActionController ::活

我认为这种方式有效:

  • 您通过控制器/操作连接
  • 保持连接(使用前端的Web套接字/ SSE)
  • 任何更新都发布到连接(通过ActionController :: Live)

我会这样做:


<强> JS

创建一个SSE监听器:

#app/assets/javascripts/special_javascript.js
jQuery(document).ready(function() {
  setTimeout(function() {
    var source = new EventSource('/your/action');
    source.addEventListener('refresh', function(e) {
      window.location.reload();
    });
  }, 1);
});

<强>控制器

class ReadingsController < ActionController::Base
  include ActionController::Live

  def create
    response.stream.write "Updated" #-> send updated db stuff
    response.stream.close
  end
end

这将允许您监视数据库中的更改。如果您希望使用新的数据库信息更新页面,我们将不得不研究如何通过数据传递

实际上,我们强烈推荐一项名为Pusher的服务来为您处理此问题