我有一个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页面上的设置但仍不清楚。任何关于此的例子或帮助将不胜感激。
答案 0 :(得分:1)
为了在没有任何用户交互的情况下更新网页内容,您有三种可能性:
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连接来实现类似的解决方案。