在网页上显示更新哈希

时间:2015-05-26 15:07:35

标签: ruby-on-rails ruby

我有一个IRC bot,可以根据某个命令更新哈希键值。这些值可以是“免费”或“采用”。调用lab status时,它将显示4个键值对{:MainSP4=>"Free", :MainSP5=>"Free", :MiniSP4=>"Free", :MiniSP5=>"Free"}的输出。我想在网页上不断显示lab status的输出,并希望在命令传递给IRC机器人时更新它。我已经尝试创建一个全局变量并调用它但没有工作,尽管它可能只是用户错误。

IRC bot

require 'cinch'
require 'chronic'
require 'sqlite3'
require 'sequel'
require 'cinch/commands'

Lab =
{MainSP4: "Free",
MainSP5: "Free",
MiniSP4: "Free",
MiniSP5: "Free"}

LabC =
{MainSP4: " ",
MainSP5: " ",
MiniSP4: " ",
MiniSP5: " "}

############### DB Connection #####################
class Database
  include Cinch::Plugin

  match /select .* from gears where .* like .*/i

  def execute(m)
    db = SQLite3::Database.open("development.sqlite3")
    m.reply db.execute("#{m.message}")
end
end

############## Lab status and Commands ####################
class Racks
  include Cinch::Plugin

  match /lab status/i
  def execute(l)
    l.reply "#{Lab}"
  end
end 

查看

<% $Lab.each do |key, value| %>
    <li><%= "#{key}: #{value}" %>
<% end %>

我决定去websockets路线。我已经安装了使用我的rails app实现websockets的所有要求。现在我卡住了,因为我不知道如何设置我的websocketcontroller.rb,events.rb。我已经阅读了github wiki页面上的设置但仍不清楚。任何关于此的例子或帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

为了在没有任何用户交互的情况下更新网页内容,您有三种可能性:

  1. 从客户端到服务器的持续轮询(高带宽使用,易于通过jquery实现,开箱即用)
  2. Websockets(取决于您的Web服务器功能)
  3. 服务器发送事件(从未尝试过,但听起来也很有希望)
  4. Ilya Bodrov-Krukowski在网站上发布了一系列关于此事的帖子。

    http://www.sitepoint.com/mini-chat-rails/(常规投票)

    http://www.sitepoint.com/realtime-mini-chat-rails-faye/(websockets)

    http://www.sitepoint.com/mini-chat-rails-server-sent-events/(SSEs)

    希望您找到最适合您的解决方案。

答案 1 :(得分:1)

这不是HTTP的工作方式。从服务器请求网页后,它会呈现它,将其发送到客户端并关闭连接。在发出另一个请求之前,客户端和服务器之间没有进一步的通信。为了在客户端页面上进行实时更新,有几个选项可用,所有这些选项都使用JavaScript在客户端和服务器之间进行异步通信:

实现最简单的选项是AJAX轮询。客户端重复连接回服务器以通过JavaScript检查当前值。通常,单独的HTTP端点以JSON格式提供数据,以使其可供客户端使用。当值发生更改时,JavaScript会相应地更新DOM,并且用户会看到新值。这种方法的缺点是客户端会发送大量不必要的请求,即使这些值实际上没有变化。在最坏的情况下,您的延迟也与更新间隔一样长。

使用Web套接字,客户端和服务器之间保持单独的连接,并且可以在两者之间来回发送数据。使用这种方法,您可能会受益于更少的开销,更快的更新(无需等待下一个更新间隔),并且除非值实际发生更改,否则不会进行任何通信。但是,这需要更多的努力来实现。可以使用长轮询或持久HTTP连接来实现类似的解决方案。