如何注入sintra / haml?

时间:2010-10-15 06:07:30

标签: ruby sinatra haml

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

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

点击index.haml 中的链接后,我想

  • 显示将要运行的脚本然后
  • 运行ant脚本然后
  • 显示结果。

recommended in my other question使用

我不明白一个单独的工作线程如何帮助我。一旦作业完成,ruby呼叫捕获的延迟作业结果是否会被发送到浏览器?

我也没有得到如何在sinatra中使用Ajax。

有人可以指出我的解决办法是什么样的?请注意,我知道一点红宝石,昨天学习了一些sinatra和haml。没有关于Ajax的事情:-)我通过实例学习......并乐于学习任何东西。

index.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>

run.haml看起来像

    !!!  
    %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

2 个答案:

答案 0 :(得分:1)

如果你想使用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)
}

使用dojo的xhrGet示例。请参阅内联评论。

  • xhrLoadClientMenu(param)由事件触发;
  • 来自页面的id为#div_menu的HTML元素存储在result_node对象中;
  • xhrArgs对象设置Ajax请求属性,如:
    1. url:呈现内容的Sinatra处理程序;
    2. load:function从sinatra获取响应并在加载完成时替换result_node内容
    3. 错误,如果出现问题,此消息将显示在result_node;
  • 同时您可以在加载实际内容时将result_node内容设置为任何内容;
  • 最后一行执行xhr请求。

所有这一切都在没有页面重新加载的情况下发生。

答案 1 :(得分:1)

Delayed_job结果确实已“返回浏览器”。请带another look at this live example of using Sinatra and DJ to process a task asynchronously and push the result to the browser once the task is complete

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

所以也许你可以利用delayed_job为你的测试套件的异步处理创建一个队列 - 从页面的其余部分“不同步”,但也可以选择将数据“递增地”传递回来任务完成。

现在,Ajax提供了另一种提供相同功能的方法。我绝对明确地建议获得一个Javascript框架,并学习如何以这种方式进行这种异步处理。但是,根据您之前的问题,我仍然建议您通过the source code of the example above using Sinatra and delayed_job,因为它已经非常接近您要做的事情,更不用说它会让您完全使用Ruby。