0

我尝试构建一个 html 页面,其中内部文本可以通过 ruby​​script 文件进行修改。rubyscript 永久运行,并且 html 页面具有自动刷新(每隔几分钟),因此其内容会发生变化。在 html 页面上还有一个按钮,通过该按钮可以在 ruby​​script 文件中调用某个方法。

现在我的 ruby​​ 脚本加载 html 页面,进行一些更改并保存文件。刷新后,html 页面上的内容发生了变化。

require 'nokogiri'
require 'rubygems'

def currentTime
   doc = Nokogiri::HTML(File.open("Path/to/index.html"))
   doc.xpath("//*[@id='time']").inner_html = "#{Time.now}"
   sleep 10
   File.open("Path/To/index.html", 'w+') {|f| f.write(doc) }
end

def main
   while true
        currentTime()
   end
end

main()

我认为这不是正确的方法,如何通过单击页面上的按钮直接调用 currentTime() ?

4

1 回答 1

0

使用本地文件和代码的浏览器的行为与更完整的 Web 服务有一些不同。这些差异之一是您没有简单的方法来触发服务器端代码,因为没有服务器。您的下一步应该是在 Web 服务器环境中重新实现 HTML 生成,而不是写入文件。

我推荐 Sinatra 作为您的第一个 Web 服务,尽管 Ruby on Rails 也是一个流行的选择,但这里要展示的代码太多了。这是您原样传输到 Sinatra 应用程序的代码:

应用程序.rb

require 'sinatra'
require 'nokogiri'

get '/main' do
  doc = Nokogiri::HTML(File.open("Path/to/index.html"))
  doc.xpath("//*[@id='time']")[0].inner_html = "#{Time.now}"
  doc.to_s
end

如果你运行这个 eg ruby app.rb,那么 Sinatra 将自动启动一个本地开发 web 服务器,你可以将你的 web 浏览器指向类似的地址http://127.0.0.1:4567/main(Sinatra 在启动 web 服务器时告诉你它正在使用哪个端口)。现在您只需在浏览器中刷新页面即可获取最新时间。

这只是一个开始。有很多技术需要进一步学习和决定。例如,使用 Nokogiri 解析 HTML 和交换值是非常低效的,您可能需要一个模板引擎来代替,例如erb.

于 2013-10-30T08:38:43.310 回答