как вводить в sintra/haml?

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

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

После перехода по ссылке из index.haml я хочу

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

Мне рекомендовали в моем другом вопросе использовать

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

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

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

person Radek    schedule 15.10.2010    source источник


Ответы (2)


Если вы хотите использовать 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)
}

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

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

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

person kfl62    schedule 15.10.2010
comment
@ kfl62: ваш пример запроса Ajax отображает (создает) всю страницу? если да, то мне кажется, что мне нужно создать еще одну страницу для вызова аякса. - person Radek; 18.10.2010
comment
запрос Ajax не обрабатывается, это делает Синатра. Ajax получает только отображаемую информацию от Sinatra и заменяет ею result_node содержимое без перезагрузки всей страницы. - person kfl62; 18.10.2010
comment
стало намного понятнее, спасибо за правку. Тем не менее, необходимо некоторое уточнение. Является ли код Ajax частью «sinatra run get»? если да, я думаю, мне нужен новый sinatra 'get' для обработки запроса ajax... или? :-) - person Radek; 18.10.2010
comment
@kfl62: спасибо. Это работает :-) Я использовал только примеры с w3schools.com - person Radek; 19.10.2010
comment
@kfl62: немного борется с stackoverflow.com/questions/3965834/ хотя - person Radek; 20.10.2010

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

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

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

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

person Joseph Weissman    schedule 16.10.2010
comment
Я пытался использовать демо-страницу в пятницу и сейчас в понедельник, и ничего не было переведено. Так что мне казалось, что это не работает. Так что похоже, что это действительно ОЧЕНЬ ОЧЕНЬ задерживается. - person Radek; 18.10.2010
comment
Я хочу знать, должен ли пользователь обновить страницу или результат задания появится после того, как оно завершится само по себе - person Radek; 18.10.2010
comment
Что ж, смотрите - вы захотите загрузить исходный код и запустить его на своей машине, чтобы увидеть, какова на самом деле производительность. Опять же, это просто пример :) Вы также можете попробовать поиграть с Ajax - см. другой ответ для хорошего списка фреймворков - которые определенно могут автоматически вставлять результат для вас без обновления. - person Joseph Weissman; 18.10.2010
comment
так что delayed_job не будет auto-insert результатов? - person Radek; 18.10.2010