как вводить в синтра / хамл? - PullRequest
3 голосов
/ 15 октября 2010

Я написал небольшое веб-приложение, которое запускает ant (пакетный файл). Время обработки командного файла может занять до нескольких минут.

index.haml перечисляет все доступные файлы ant, и run.haml запускает их. Теперь он работает так: когда я щелкаю ссылку в index.haml, запускается скрипт ant, а после его завершения вся страница run.haml отправляется в браузер. Так что после нажатия на ссылку из index.haml я все еще вижу index.haml и ничего из run.haml

После того, как я нажму на ссылку из index.haml Я хочу

  • показать, какой скрипт будет запущен, а затем
  • запустить скрипт ant, а затем
  • отобразить результаты этого.

Я был рекомендован в моем другом вопросе , чтобы использовать

Я не понимал, как отдельный рабочий поток может мне помочь. Будут ли результаты отложенного задания, которые фиксируются вызовом ruby, отправляться в браузер после завершения задания?

Я также не понял, как я могу использовать Аякс в синатре.

Может ли кто-нибудь указать мне, каким может быть решение для этого? Пожалуйста, обратите внимание, что я знаю немного рубина, выучил немного синатры и хамла вчера. В 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 ]

1 голос
/ 16 октября 2010

Результаты Delayed_job действительно отправляются «обратно в браузер».Пожалуйста, посмотрите еще раз на этот живой пример использования Sinatra и DJ для асинхронной обработки задачи и отправьте результат в браузер, как только задача будет завершена .

Вызов выполняется асинхронно, загружается остальная часть страницы, и после завершения вызовов данные отправляются обратно на страницу.Теперь, поскольку он находится в облаке, он может показаться ОЧЕНЬ отложенным;Вы захотите скачать исходный код и запустить его на своем компьютере, чтобы посмотреть, какой скоростной ди-джей предлагает в локальной сети.Результаты действительно обрабатываются и отправляются обратно;прокрутите страницу вниз, и вы увидите результаты предыдущей обработки - вы даже можете ввести свой собственный текстовый блок для добавления в очередь обработки.

Так что, возможно, вы могли бы использовать delayed_job для создания очереди для асинхронной обработки ваших наборов тестов - «не синхронизировано» с остальной частью вашей страницы, но также с возможностью передачи данных «постепенно» кактакже, как только задача завершится.

Теперь Ajax предлагает еще один способ предоставить такую ​​же функциональность.Я абсолютно и безоговорочно рекомендую получить одну из фреймворков Javascript и научиться так же выполнять асинхронную обработку такого рода.Однако, основываясь на вашем предыдущем вопросе, я бы по-прежнему предлагал проработать исходный код приведенного выше примера с использованием Sinatra и delayed_job , поскольку это уже очень близко к тому, что вы пытаетесь сделать, не говоря уже о том, что онодержит вас полностью в Ruby.

1 голос
/ 15 октября 2010

Если вы хотите использовать Ajax must, выберите библиотеку 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)
}

пример xhrGet с использованием dojo. Смотрите встроенные комментарии.

  • xhrLoadClientMenu (param) запускается событием;
  • HTML-элемент с идентификатором #div_menu со страницы сохраняется в объекте result_node;
  • Объект xhrArgs устанавливает свойства запроса Ajax, например:
    1. url: обработчик Sinatra, который отображает содержимое;
    2. load: функция получает ответ от sinatra и заменяет содержимое result_node, когда загрузка завершена
    3. ошибка, если что-то идет не так, это сообщение будет показано в result_node;
  • тем временем вы можете установить содержимое result_node на что угодно, пока загружается реальное содержимое;
  • последняя строка выполняет запрос xhr.

Все это происходит без перезагрузки страницы.

...