Как правильно создать новый XMLHttpRequest из ответа RJS в Ruby on Rails?

Я пытаюсь приблизиться к решению проблемы моего предыдущего вопроса.

Схема, которую я хотел бы попробовать, следующая:

  1. Пользователь запрашивает действие у контроллера RoR.
  2. Action makes some database queries, makes some calculations, sets some session variable(s) and returns some RJS code as the response. This code could either
    • update a progress bar and make another ajax request.
    • отображать окончательный результат (например, графическую диаграмму), если вся обработка завершена
  3. Браузер оценивает javascript-представление RJS. Он может сделать другой (рекурсивный? Рекурсия вообще разрешена?) запрос или просто отобразить результат для пользователя.

Итак, мой вопрос на этот раз: как я могу правильно встроить вызов XMLHttpRequest в код rjs?

Вот некоторые вещи, которые я хотел бы знать:

Должен ли я создать новый поток, чтобы избежать переполнения стека. Какие помощники рельсов (если есть) следует использовать?

Кто-нибудь когда-нибудь делал что-то подобное на Rails или других фреймворках?

Здрава ли моя идея?


person Yuri Baranov    schedule 01.04.2010    source источник
comment
Это не рекурсивно; последующие запросы от браузера будут совершенно новыми транзакциями HTTP.   -  person Pointy    schedule 01.04.2010


Ответы (1)


В наши дни вам может быть труднее найти информацию о RJS, я думаю, что ненавязчивый JavaScript получил больше внимания в сообществе Rails. То, что вы описываете, безусловно, возможно. Я предлагаю потратить немного времени на изучение AJAX с помощью jQuery. Вот несколько шагов, которые вы можете предпринять: 1) сделать запрос GET к действию контроллера, 2) сделать что-то, ответить JSON, 3) на стороне клиента кода обработчика успеха определить, нужно ли вам снова вызывать сервер.

Проверьте Railscast на jQuery, вот транскрипция http://asciicasts.com/episodes/136-jquery< /а>

jQuery $.get() или $.getJSON http://api.jquery.com/jQuery.get/

Блок Rails respond_to, ознакомьтесь с кодом «wants.js» здесь http://www.mckinneystation.com/2009/07/13/rails-respond_to-made-it-too-easy/

Вы можете ответить своим объектом Ruby, сериализованным как JSON: render :json => @thing.to_json

Использование $.getJSON() десериализует ответ в объект JavaScript, поэтому вы легко получаете доступ к свойствам с помощью точечного синтаксиса. например (псевдокод): $.getJSON('/url-to-thing.js', function(thing) { if( thing.status != 'done' ) { /* call function again */ } });

Таким образом, функция перестанет вызываться, как только «дело» будет «сделано». Освоение обязанностей клиентской и серверной частей может быть пугающим поначалу, но в долгосрочной перспективе это окупится, позволяя вам разрабатывать гораздо более динамичные и интерактивные веб-приложения.

person Andy Atkinson    schedule 01.04.2010