1

我正在制作一个只有我才能访问的简单 rails (3.2.11) 演示。我有以下内容:

1) 一个名为 Food 的 Rails 脚手架

2)一个可以调用自定义路由/控制器的android设备,然后创建一个新的食物。( Food.create...)。

因此,在我的计算机浏览器上,我加载了http://myapp.com托管 rails 应用程序的 . 立即,它加载了所有食物,因为它正在渲染foods#index。然而,当我Food从我的安卓设备调用创建一个新的时,浏览器页面(在我的电脑上)仍然显示旧的食物列表,即使数据库知道有新的食物。(因为此时我还没有刷新页面)

当数据库更改表时,如何添加“侦听器/观察者”以自动刷新页面Food?这可能吗?

我不是在寻找,<meta http-equiv="refresh" content="5">因为我想在整个 30 分钟的演示中让我的计算机浏览器保持打开状态。

==================

另外,我已经3年多没有使用rails了,所以如果你好心回答,请解释一下,以便初学者理解?(明确的细节是首选)

4

3 回答 3

1

我建议看看Faye。有一个关于它的优秀Railscast详细介绍了如何设置它。

于 2013-08-19T06:43:58.750 回答
1

查看EventSourceWebSockets以进行实时开发。还有其他选择,例如长轮询。但是,如果您要从同一页面添加新食物,则可以轻松捕获该事件并刷新数据。

于 2013-08-19T03:50:07.303 回答
1

过去,一个常见的选择是使用Juggernaut将数据从服务器推送到客户端。它甚至在 websockets 被广泛使用之前就被使用了,但最近它已经被弃用,取而代之的是HTML5 Server-Sent-Events (SSE)。要使用 SSE,您可以像这样应用客户端侦听器:

var source = new EventSource('/stream');
source.addEventListener('message', function(e) {
  console.log('Received a message:', e.data);

  //fetch new data with AJAX, or reload
  location.reload();
});

服务器端,发送事件的方式有很多种。使用Cramp,发送事件是这样完成的(取自文档):

class TimeAction < Cramp::Action
  self.transport = :sse
  #set the transport to Server-Sent Event

  on_start :send_latest_time
  periodic_timer :send_latest_time, :every => 2

  def send_latest_time
    data = {'time' => Time.now.to_i}.to_json
    render data
  end
end

如果您使用 Sinatra,您的代码将如下所示:

get '/stream', :provides => 'text/event-stream' do
  stream :keep_open do |out|
    connections << out
    out.callback { connections.delete(out) }
  end
end

除了 Internet Explorer 和 Opera Mini,几乎所有浏览器都支持服务器发送事件,但也有一些备用/polyfill 库,例如此处此处的一个(jQuery 解决方案)。与 websocket 不同,它们仍然使用 HTTP 协议,但请记住,它们是单向的,而 websocket 可用于多向通信。如果您对 SSE 和 websockets 之间的区别感到好奇,请参阅此处

于 2013-08-28T19:14:03.273 回答