Ruby 如何注入sintra/haml?

Ruby 如何注入sintra/haml?,ruby,sinatra,haml,Ruby,Sinatra,Haml,我编写了运行ant(批处理文件)的小型web应用程序。批处理文件的处理时间可能长达分钟 index.haml列出所有可用的ant文件并运行。haml运行它们。它现在的工作流程是,当我单击index.haml中的链接时,ant脚本将运行,完成整个run.haml页面后将发送到浏览器。所以在单击index.haml中的链接后,我仍然可以看到index.haml,而run.haml中没有任何内容 单击index.haml中的链接后我想 显示要运行的脚本,然后 运行ant脚本,然后 显示它的结果 我

我编写了运行ant(批处理文件)的小型web应用程序。批处理文件的处理时间可能长达分钟

index.haml列出所有可用的ant文件并运行。haml运行它们。它现在的工作流程是,当我单击index.haml中的链接时,ant脚本将运行,完成整个run.haml页面后将发送到浏览器。所以在单击index.haml中的链接后,我仍然可以看到index.haml,而run.haml中没有任何内容

单击index.haml中的链接后我想

  • 显示要运行的脚本,然后
  • 运行ant脚本,然后
  • 显示它的结果
我要用

  • 一个单独的工作线程。喜欢,还是
我不明白一个单独的工作线程如何帮助我。ruby调用捕获的延迟作业结果是否会在作业完成后发送到浏览器

我也不知道如何在sinatra中使用Ajax

有人能告诉我解决这个问题的办法是什么吗?请注意,我知道一点红宝石,昨天学了一点辛纳屈和哈姆。没有关于Ajax的任何内容:-)我通过示例学习。。。而且很高兴学到任何东西

haml给了我类似html的

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
      <head>
        <title>Available test suits</title>
      </head>
      <body>
        <h1>Available test suits</h1>
        <br/><br/>
        <a href='run?run=login_build'>login_build</a>
        <br />
        <a href='run?run=login_cycle_build'>login_cycle_build</a>
        <br />
        <a href='run?run=login_cycle_academicyear_build'>login_cycle_academicyear_build</a>
      </body>
    </html>

可用测试套装
可用测试套装




跑吧,哈姆看起来像

    !!!  
    %html  
      %head  
        %title Running  
      %body
        = "Starting test suite: #{params['run']}"
        - output = %x[cd C:\\Program Files\\TestPro\\TestPro Automation Framework410 && ant -lib lib -f "C:\\Program Files\\TestPro\\TestPro Automation Framework410\\Output Files\\builds\\#{params['run']}.xml"]
        -#The result is
        %br
        = output.split("\n")[-2,2].join("<BR>")
        = "<br/>"*2
        %a(href="/")back to suits list
!!!
%html
%头
%标题运行
%身体
=“正在启动测试套件:#{params['run']}”
-输出=%x[cd C:\\Program Files\\TestPro\\TestPro Automation Framework410&&ant-lib lib-f“C:\\Program Files\\TestPro\\TestPro Automation Framework410\\output Files\\builds\\\\\\{params['run']}.xml”]
-#结果是
%溴
=output.split(“\n”)[-2,2]。join(
) =“
”*2 %a(href=“/”)返回诉讼列表
如果您想使用Ajax,必须选择javascript库Dojo、Prototype、Mootools、jQuery。。。它们中的每一个都有处理ajax请求的特定工具

在javascript中,您可以发出一个xhr(Ajax请求),该请求可能是异步的,但Sinatra仍然为您提供所需的内容,您可以在网页中显示所需的内容

var xhrLoadClientMenu = function(param){
var result_node = dojo.byId('div_menu')
var xhrArgs = {
  // the Sinatra get "/run" ... end handler
  url: '/run',
  load: function(data){
    // When response is rendered come's here 
    result_node.innerHTML = data;
  },
  error: function(error){
    msg = "<p>Ooops some error ...<br><br>" + error + "</p>";
   }
 }
  // Here you can put what you want to display durring loading
  result_node.innerHtml = "Loading..." 
  var defered = dojo.xhrGet(xhrArgs)
}
var xhrLoadClientMenu=函数(param){
var result\u node=dojo.byId('div\u menu')
变量xhrags={
//Sinatra获取“/运行”…结束处理程序
url:“/run”,
加载:函数(数据){
//当回应被呈现出来的时候,我们来了
result_node.innerHTML=数据;
},
错误:函数(错误){
msg=“ooopsomeerror…

”+error+“

”; } } //在这里,您可以在加载过程中放置要显示的内容 结果\u node.innerHtml=“正在加载…” var defered=dojo.xhrGet(xhrags) }
一个使用dojo的xhrGet示例。请参阅内联注释

  • xhrLoadClientMenu(参数)由事件触发
  • 结果节点对象中存储了一个id为#div_菜单的HTML元素
  • XHRAGS对象设置Ajax请求属性,如:
  • url:呈现内容的Sinatra处理程序
  • 加载:函数从sinatra获取响应,并在加载完成时替换结果节点内容
  • 错误如果出现错误,此消息将显示在结果节点中
  • 同时,在加载真实内容时,您可以将结果节点内容设置为任何内容
  • 最后一行执行xhr请求

所有这些都是在不重新加载页面的情况下发生的。

延迟的作业结果确实会“返回到浏览器”。请注意

调用以异步方式运行,页面的其余部分加载,调用完成后,数据将发布回页面。现在,由于它在云端,它可能看起来很延迟;您需要下载源代码并在自己的机器上运行,以查看DJ在本地网络上提供的速度。结果确实被处理并发回;向下滚动页面,您将看到早期处理的结果——您甚至可以输入自己的文本块以添加到处理队列中

因此,也许您可以利用delayed_job为测试套件的异步处理创建一个队列——从页面的其余部分“不同步”,但也可以选择“增量”以及在任务完成后将数据传回


现在,Ajax提供了另一种方法来提供相同的功能。我绝对且明确地建议您使用一个Javascript框架,并学习如何以这种方式进行这种异步处理。但是,基于您之前的问题,我仍然建议您继续进行,因为它已经非常接近您要做的事情,更不用说它让您完全使用Ruby。

我尝试在周五使用演示页面,但它是Mon,没有翻译任何内容。所以在我看来它不起作用。所以它看起来确实非常非常延迟。我想知道用户是否必须刷新页面,或者作业完成后会自动显示作业结果。好吧,看——你要下载源代码并在自己的机器上运行,看看性能到底如何。同样,这只是一个示例:)您还需要尝试使用Ajax——请参阅另一个答案,以获得一个良好的框架列表——它肯定可以在不刷新的情况下自动插入结果。因此,延迟的\u作业将不会自动插入结果?@kfl62:您的Ajax请求示例是否呈现(创建)整个页面?如果是,我觉得我需要再创建一个页面来调用Ajax。Ajax请求不会呈现,Sinatra会呈现。Ajax只从Sinatra获取呈现的信息,并用它替换
result\u node
内容,而不重新加载整个页面。它更清晰,谢谢您的编辑。不过还需要一些澄清。Ajax代码是“sinatra run get”的一部分吗?如果是的话,我会的