Пересекая границы: Ajax on Rails

Почему Ajax так хорошо работает с Ruby

Об Ajax (технологии создания высоко интерактивных Web-страниц) говорится очень много. Интегрированная среда Ruby on Rails тоже процветает, частично из-за тесной интеграции с Ajax. Узнайте, что делает комбинацию Ajax on Rails такой мощной.

Брюс Тэйт, президент, RapidRed

Брюс Тэйт (Bruce Tate) является отцом, горным байкером и байдарочником, проживающим в Austin, Texas. Он автор трех бестселлеров по языку Java, в том числе, победителя Jolt "Лучше, быстрее, легче Java". Недавно издал "За пределами Java"… Он работал 13 лет в IBM, а сейчас является основателем RapidRed consultancy, где специализируется на стратегиях и архитектурах облегченной разработки, основанных на технологии Java и Ruby on Rails.



07.03.2007

В двух предыдущих статьях серии "Пересекая границы" (см. раздел "Ресурсы") вы познакомились со Streamlined, подключаемым модулем Rails, помогающим эффективно использовать функциональность scaffolding для быстрого создания простых пользовательских интерфейсов с Ajax. Вы узнали, что Ajax - это технология программирования, использующая стандарты XML, JavaScript и Web для создания высоко интерактивных Web-страниц, как, например, на Google Maps и сотнях других Web-сайтов. Некоторые читатели статей Streamlined просили меня рассказать о способе работы Ajax с Ruby on Rails. В этой статье мы рассмотрим несколько простых Ajax-примеров, из которых станет понятно, что делает комбинацию Ruby/Ajax такой эффективной. В следующей статье данной серии я более подробно рассмотрю язык программирования JavaScript.

Определение Ajax

Ajax обозначает Asynchronous JavaScript + XML. Этот термин начал использовать в 2005 году Джесс Джеймс Гаррет (Jesse James Garrett), разработчик информационных систем, для описания технологии, применявшейся в некоторых областях почти десятилетие (см. раздел "Ресурсы"). После этого использование Ajax стало повсеместным, появились библиотеки, популярные Web-сайты и соответствующая литература.

Технология Ajax переопределила базовую модель использования браузеров, заключавшуюся в единовременной визуализации страницы. Ajax дала возможность браузеру взаимодействовать с сервером в промежутках между обновлениями страницы. Выигрыш – большее удобство для пользователя, хотя и за счет повышения сложности. Ajax передает XML между сервером и клиентом, используя клиентские JavaScript-библиотеки. Ajax-разработчики могут посылать асинхронные запросы от клиента в любое время, а пользователь может продолжать свою работу в браузере во время обработки запросов. Вот последовательность выполнения Ajax-запроса:

О данной серии статей

В серии статей "Пересекая границы" ее автор Брюс Тэйт развивает мнение о том, что современные Java-программисты имеют широкие возможности для изучения других подходов и языков. Программирование очень изменилось после того, как Java-технология стала очевидным лучшим выбором для всех разрабатываемых проектов. Другие интегрированные среды формируют способ построения Java-сред, а концепции, присущие другим языкам, могут разнообразить Java-программирование. Написанный Python-код (или Ruby, или Smalltalk, или ... замените многоточие) может изменить способ Java-кодирования.

Данная серия статей знакомит с концепциями и методиками программирования, которые радикально отличны от Java-разработки, но в то же время напрямую применимы к ней. В одних случаях необходимо интегрировать технологию для использования ее возможностей. В других можно применить концепции непосредственно. Конкретное инструментальное средство не так важно, как идея о том, что другие языки программирования и интегрированные среды могут оказать влияние на разработчиков, среды разработки и даже на фундаментальные подходы в Java-сообществе.

  1. Событие (например, нажатие пользователем кнопки мыши или срабатывание программного таймера) инициирует JavaScript-функцию.
  2. JavaScript-функция создает запрос для части страницы, а не для всей страницы. Затем JavaScript передает этот запрос на Web-сервер по протоколу HTTP.
  3. Этот HTTP-запрос активизирует сценарий на сервере, например, метод Rails-контроллера или Java™-сервлет.
  4. Серверный сценарий создает XML-документ и возвращает его клиенту.
  5. По получении результата клиент асинхронно создает, обновляет или удаляет часть Web-страницы, например, элемент списка, тег div или изображение.

В любом Ajax-приложении используется подход, аналогичный описанному. Например, рассмотрим приложение, позволяющее изменять описания слов в словаре. Старые приложения должны были бы запросить новую страницу для редактирования описания. Ajax позволяет выполнить редактирование на месте, заменяя текст описания полем ввода, а затем заменяя эту форму новым описанием.

Компонентами Ajax являются:

  • Клиентская JavaScript-библиотека для поддержки асинхронных запросов.
  • Серверная библиотека для обслуживания входящих запросов и формирования XML-ответов.
  • Клиентская библиотека для работы с полученным XML.
  • Библиотека (называемая объектной моделью документа (document object model - DOM)), позволяющая обновлять существующую Web-страницу.
  • Вспомогательные подпрограммы для работы с неизбежными проблемами интеграции и UI.

Такая модель событие/запрос/ответ/замещение является базовой моделью большинства Ajax-приложений, хотя новичков в Ajax удивит количество доступных библиотек и большие различия между ними. Появилось много интегрированных Ajax-систем с частым пересечением функциональности, среди которых нет явных победителей. Только в Java используются десятки библиотек, включая Echo, Dojo, DWR, Google Web Toolkit (GWT), Java Web Parts, AjaxAnywhere, AjaxTags, Scriptaculous и Prototype. Эти системы применяют диаметрально различные подходы. Некоторые, например GWT, стремятся полностью скрыть JavaScript, предоставляя Java-библиотеки, генерирующие JavaScript-код. Другие стремятся облегчить использование JavaScript. Некоторые являются полными и универсальными (например, Dom4J), а другие просто хорошо решают отдельную проблему. Как и в случае со многими другими популярными новыми технологиями, на этой шахматной доске решений на первых порах ориентироваться тяжело, а средства отладки, UI-приемы (например, кнопка "Назад") и оптимальные методики разработки будут материализовываться медленно. Сила Ajax-библиотек на платформе Java заключается в их разнообразии. Это также и их слабость, поскольку такое разнообразие порождает неуверенность, проблемы интеграции и сложность.

Среда Ruby on Rails значительно отличается от других по двум причинам. Во-первых, Ruby on Rails использует единую платформу Web-разработки - Ruby on Rails. Во-вторых, до сих пор Ajax-разработка на Rails по большей части концентрировалась на двух основных интегрированных средах - Scriptaculous и Prototype (см. раздел "Ресурсы"). Подход Rails, использующий генерирование кода времени исполнения и пользовательские теги, избавляет от сложностей JavaScript. Настало время увидеть это собственными глазами. Как обычно, чтобы кодировать самостоятельно, нужно загрузить Rails, поставляемый с необходимыми Ajax-системами (см. раздел "Ресурсы"). Открывайте ваш Rails и давайте посмотрим на него вместе.


Простое Rails-приложение без Ajax

Для использования Rails и Ajax мы создадим пустой проект и сгенерируем контроллер с двумя методами. Один управляет простой страницей, второй формирует Ajax-ответ. Введите следующие команды:

rails ajax
cd ajax
script/generate controller ajax show time

В первой и второй строке генерируется Rails-проект и выполняется переход в новый каталог. В третьей строке генерируется контроллер под названием ajax и виды (views) для двух действий: show (отобразить) и time (время). В листинге 1 представлен код контроллера:

Листинг 1. Контроллер с двумя пустыми методами
class AjaxController < ApplicationController

   def show
   end

   def time
   end
end

Сначала мы создадим два простых вида без Ajax, а затем соединим их вместе при помощи Ajax. Отредактируйте вид show.rhtml в app/views/ajax так, как показано в листинге 2:

Листинг 2. Простой вид
<h1>Ajax show</h1>
Click this link to show the current <%= link_to "time", :action => "time" %>.

Код в листингах 1 и 2 не использует Ajax-поддержку, но мы все равно исследуем его. Прежде всего, взгляните на контроллер в листинге 1. Два пустых метода контроллера обрабатывают входящие HTTP-запросы. Если вид не визуализируется явно (используя метод render), Rails визуализирует вид с тем же названием, что и название метода. Поскольку библиотеки Scriptaculous и Prototype тоже используют HTTP, Rails не должен делать каких-либо различий между стандартными HTTP-методами и Ajax-методами.

Теперь обратим внимание на вид в листинге 2. Большая часть кода - это простой HTML, за исключением link_to во второй строке: <%= link_to "time", :action => "time" %>.

Как отмечалось в предыдущих статьях серии "Пересекая границы", Ruby заменяет код между <%=h и %> значениями выражения. В данном случае метод link-to генерирует простую HTML-ссылку. Эту ссылку можно увидеть, выполняя код. Запустите сервер при помощи команды script/server и укажите в браузере ссылку http://localhost:3000/ajax/show. Отобразится вид, показанный на рисунке 1:

Рисунок 1. Простой пользовательский интерфейс без Ajax
Рисунок 1. Простой пользовательский интерфейс без Ajax

В браузере выберите пункт меню для просмотра исходного кода страницы (View > Source в Internet Explorer и View > Page Source в Firefox). Вы увидите код, приведенный в листинге 3:

Листинг 3. Вид, сгенерированный show.rhtml
<h1>Ajax show</h1>
Click this link to show the current <a href="/ajax/time">time</a>.

Обратите внимание на код ссылки в листинге 3. Шаблон защищает Rails-пользователя от громоздкого и подверженного ошибкам HTML-синтаксиса (Ajax работает аналогичным образом: вы используете вспомогательные методы для вставки JavaScript-кода, управляющего вместо вас удаленными запросами и HTML-замещениями). При нажатии ссылки отобразится вид по умолчанию для метода time, но мы его еще не реализовали. Замените метод time в app/controllers/ajax_controller.rb кодом, приведенным в листинге 4. Для простоты я визуализирую вид прямо из контроллера. Позже я подчищу код.

Листинг 4. Визуализация времени
def time
  render_text "The current time is #{Time.now.to_s}"
end

Теперь при нажатии ссылки отобразится вид показанный на рисунке 2:

Рисунок 2. Вид без Ajax
Рисунок 2. Вид без Ajax

Сразу видна проблема в этом UI. Два вида не размещены на отдельных страницах. Приложение представляет простую концепцию: нажмите ссылку для отображения времени. Для периодического обновления времени нужно каждый раз нажимать ссылку и затем кнопку "Назад". Можно решить эту проблему, поместив ссылку и время на одну и ту же страницу. Но если страница show становится очень большой или сложной, повторное отображение всей страницы занимает много времени.


Добавляем Ajax

Ajax позволяет обновлять только фрагмент Web-страницы. Rails-библиотеки делают за вас основную часть работы. Чтобы добавить Ajax к данному приложению, нужно выполнить следующие действия:

  1. Настроить Rails на использование JavaScript.
  2. Изменить ссылку time для отправки JavaScript Ajax-запроса вместо простой визуализации HTML-ссылки.
  3. Указать HTML-фрагмент для обновления.
  4. Подготовить место для обновленного HTML-содержимого.
  5. Создать метод контроллера и, возможно, вид для визуализации Ajax-ответа.

Для начала измените код в app/views/ajax/show.rhtml так, как показано в листинге 5:

Листинг 5. Изменение вида show для использования Ajax
<%= javascript_include_tag :defaults %>
<h1>Ajax show</h1>
Click this link to show the current 
<%= link_to_remote "time", 
    :update => 'time_div', 
    :url => {:action => "time"} %>.<br/>
<div id='time_div'>
</div>

Я сделал несколько изменений. Во-первых, чтобы пример работал, я просто подключил необходимые JavaScript-библиотеки непосредственно к виду. Обычно (если имеется несколько видов и для устранения дублирования) я включаю JavaScript-файлы в общий Rails-компонент, например, Rails-схему (layout). В этом примере используется только один вид, поэтому я многое упростил.

Во-вторых, я изменил тег link для использования link_to_remote. Скоро будет видно, что делает эта ссылка. Обратите внимание на три параметра:

  • Текст ссылки, который не изменился.
  • Параметр :update. Если такой синтаксис прежде не встречался, думайте о :update => 'time_div' как о поименованном параметре, где :update - имя, а update_div - значение. Этот код указывает Prototype-библиотеке, что данная ссылка будет обновлять HTML-элемент с именем time_div.
  • :url => {:action => "time"} - указывает URL, который будет активизировать ссылка. :url принимает значение хэш-карты. На практике хэш-карта имеет только один элемент для действия контроллера - :time. Теоретически URL мог бы также содержать название контроллера и все необязательные параметры, которые могут понадобиться контроллеру.

В листинге 5 имеется также пустой элемент div, который Rails будет обновлять текущим временем.

В браузере загрузите страницу http://localhost:3000/ajax/show. Нажмите кнопку мыши на ссылке. Должна отобразиться страница, показанная на рисунке 3:

Рисунок 3. Вид с Ajax
Рисунок 3. Вид с Ajax

Взгляните на исходный код Web-страницы, чтобы лучше представить, что происходит. Код страницы показан в листинге 6:

Листинг 6. Результат шаблона show с использованием Ajax
<script src="/javascripts/prototype.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/effects.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/dragdrop.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/controls.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/application.js?1159113688" type="text/javascript"></script>
<h1>Ajax show</h1>
Click this link to show the current 
<a href="#" onclick="new Ajax.Updater(
   'time_div', '/ajax/time', {asynchronous:true, evalScripts:true}); 
   return false;">time</a>.<br/>
<div id='time_div'>

</div>

Обратите внимание на список подключенных JavaScript-файлов. Вспомогательная команда Rails (include_javascript_tags :defaults) создает этот список за вас. Далее, вместо HTML-ссылки указан вызов JavaScript-функции для создания нового объекта Ajax.Updater. Параметр asynchronous установлен в значение true, как и можно было ожидать. Наконец, внутри HTML-тегов div ничего нет, поскольку на первоначальной странице там ничего и не было.


Использование других функций Ajax

Ajax может генерировать разнообразные виды поведения, иногда даже несколько неожиданные. Допустим, пользователь не заметил ссылку на обновленное время. Параметр link_to_remote позволяет легко применить специальные эффекты, так что пользователь заметит результат. Давайте используем некоторые эффекты. Измените link_to_remote в show.rhtml по примеру листинга 7:

Листинг 7. Добавляем эффекты
<%= link_to_remote "time", 
    :update => 'time_div', 
    :url => {:action => "time"},
    :complete => "new Effect.Highlight('time_div')" %>

Лучшие Ajax-эффекты привлекают внимание, но оно не вечно. Целью должно быть отображение изменений без прерывания работы пользователей. Технические приемы (как данное затенение или содержимое, которое скользит или медленно проявляется) не должны постоянно отвлекать внимание.

Ссылка - это пока единственный триггер, который вы видели. Ajax может предложить несколько вариантов: одни управляются пользователями, другие - программными событиями. Такие элементы, как часы, не обязательно должны требовать вмешательства пользователя. Таймер в Ajax можно обновлять периодически при помощи метода periodically_call_remote. Измените код в show.rhtml так, как показано в листинге 8:

Листинг 8. Периодический вызов удаленного метода
<%= javascript_include_tag :defaults %>
<h1>Ajax show</h1>
<%= periodically_call_remote :update => 'time_div', 
                             :url => {:action => "time"},
                             :frequency => 1.0 %>
<div id='time_div'>
</div>

На рисунке 4 показан результат: часы, обновляющие свои показания ежесекундно без вмешательства пользователя:

Рисунок 4. Периодически обновляющиеся часы с Ajax
Рисунок 4. Периодически обновляющиеся часы с Ajax

Хотя код в Rails-виде похож на версию без Ajax, получаемый исходный код страницы значительно отличается: в этой версии используется JavaScript вместо HTML. Код листинга 9 можно увидеть при просмотре исходного кода страницы в браузере:

Листинг 9. Исходный код для periodically_call_remote
<script src="/javascripts/prototype.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/effects.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/dragdrop.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/controls.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/application.js?1159113688" type="text/javascript"></script>
<h1>Ajax show</h1>
<script type="text/javascript">
//<![CDATA[
new PeriodicalExecuter(function() {new Ajax.Updater(
   'time_div', '/ajax/time', {asynchronous:true, evalScripts:true})}, 1.0)
//]]>
</script>
<div id='time_div'>
</div>

Обратите особое внимание на то, что здесь происходит. Вместо работы с небольшими фрагментами JavaScript используется более высокий уровень абстракции, и система шаблонов Ruby on Rails делает использование модели довольно естественным.

Как упоминалось ранее, я визуализирую текст прямо из контроллера. Это упрощение облегчает начало работы, но не может использоваться постоянно. Мои виды должны обрабатывать представление, а контроллеры должны группировать и передавать (маршализировать) данные между видом и моделью. Такая технология проектирования, называемая модель-представление-контроллер (model-view-controller - MVC), облегчает изолирование изменений представления или модели. Для использования в этом приложении MVC я могу просто разрешить Rails визуализировать вид по умолчанию, и содержимое, как и ожидается, будет заменять старое содержимое time-div. Измените метод time в app/controllers/ajax_controller.rb, как показано в листинге 10:

Листинг 10. Рефакторинг
def time
  @time = Time.now
end

Измените вид в app/views/ajax/time.rhtml, как показано в листинге 11:

Листинг 11. Использование вида для визуализации Ajax-содержимого
<p>The current time is <%=h @time %></p>

Метод контроллера создает экземпляр переменной @time. Поскольку контроллер ничего явно не визуализирует, Rails визуализирует вид time.rhtml. Такая модель использования полностью аналогична модели визуализации вида без Ajax. Опять же, видно, что Rails изолирует разработчиков от различий между приложениями, использующими и не использующими Ajax. Модель использования в традиционных Web-приложениях и Ajax-приложениях поразительно похожа. Затраты настолько низкие, что все больше Rails-приложений используют преимущества Ajax.


Другие способы использования Ajax в Rails

Технология Ajax в Rails используется широко и глубоко - намного глубже, чем я могу описать в одной статье или даже в серии статей. Ниже приведены некоторые примеры использования Ajax в Rails, показывающие, насколько хорошо Ajax-поддержка в Rails решает некоторые другие проблемы.

  • Подтверждение удаленных форм. Ajax-формы в Rails работают аналогично традиционным формам, за исключением того, что нужно подтверждать их асинхронно. Это означает, что вспомогательные теги Forms в Rails должны разрешать указывать URL для обновления и выполнять визуальные эффекты, точно так же, как в случае с link_to_remote. Rails submit_to_remote расширяет Rails submit так же, как link-to-remote расширяет link_to.
  • Выполнение сложных сценариев. Rails-разработчикам часто нужно выполнить сложные сценарии, делающие нечто большее, чем просто обновление одного div и визуализация эффектов. Для этой цели Rails предоставляет JavaScript-шаблоны. С JavaScript-шаблоном можно выполнить произвольный JavaScript-сценарий как результат Ajax-запроса. Некоторые часто применяемые для этого шаблоны, называемые RJS-шаблонами, обновляют больше одного div, проверяют правильность заполнения формы и управляют сценариями Ajax-ошибок.
  • Завершение. Часто хочется предложить пользователям функциональность автоматического завершения на основе элементов, содержащихся в базе данных. Например, если пользователь набирает Bru, хотелось бы, чтобы приложение нашло в базе данных значение "Bruce Tate". Можно использовать Ajax для периодической проверки изменений в поле и передачи пользователю предложений для завершения набираемого текста.
  • Динамическое создание сложных форм. В бизнес-деятельности часто требуется видеть часть заполненной формы до того, как станет известно, какие поля должен заполнить пользователь. Например, налоговая форма 1040EZ не применяется, если пользователь имеет определенные типы доходов или расходов. С Ajax можно легко обновлять форму в процессе ее заполнения.
  • Перетащить и оставить (drag and drop). В Rails можно быстро реализовать поддержку техники "перетащить и оставить" с намного меньшими усилиями, чем в большинстве других интегрированных систем.

Заключение

У Ajax есть свои проблемы. Когда все идет хорошо, полные возможности этой технологии могут поразить воображение. Когда дела плохи, обнаруживается, что отладка переходит совершенно в новое измерение, а технологии отладки и инструментальные средства для нее все еще не соответствуют уровню, имеющемуся в других языках программирования. Ruby on Rails имеет одно основное преимущество - простоту. Rails-средства надстройки совместно с фантастической поддержкой сообщества пользователей облегчают погружение в этот новый мир при очень небольших начальных инвестициях. Но Rails-поддержка еще не достаточна. Две интегрированные системы, которые не полностью охватывают все сферы Ajax, удовлетворят не каждого пользователя.

Существует много интегрированных Ajax-систем и подходов для языка программирования Java, из которых есть что выбрать. Можно обнаружить значительную гибкость и фантастическую поддержку. Но за гибкость надо платить. Ведь потребуется не только надежная Ajax-среда, но и среда Web-разработки. Например, интеграция среды JSF кардинально отличается от интеграции Struts. Новые технологии часто требуют упрощения. Ajax с Rails может решить проблемы, относящиеся к сложности применения Ajax в UI, но не обеспечить продвинутых возможностей корпоративной интеграции, предоставляемых языком Java. В следующий раз я подробнее остановлюсь на JavaScript. А пока продолжайте пересекать границы.

Ресурсы

Научиться

  • Оригинал статьи "Crossing borders: Ajax on Rails".
  • От Java к Ruby: Что должен знать ваш менеджер (Pragmatic Bookshelf, 2006): Книга автора о том, когда и где имеет смысл перейти от языка программирования Java к Ruby on Rails и как это сделать.
  • За пределами Java (O'Reilly, 2005): Книга автора о становлении языка Java и технологий, которые могли бы расширить использование платформы Java.
  • "Обзор книги: Agile Web-разработка с Rails" (Даррен Торпэй (Darren Torpey), developerWorks, май 2005): Обзор книги, которая углубляет понимание Rails и логическое обоснование agile-подходов к разработке.
  • "Ajax: новый подход к Web-приложениям" (Джесс Джеймс Гаррет (Jesse James Garrett), Adaptive Path, февраль 2005): Гаррет (тот, кто придумал термин "Ajax") описывает основные архитектурные и пользовательские свойства этой технологии..
  • Scriptaculous и Prototype: Две интегрированные JavaScript-среды, использующиеся в Rails Ajax.
  • Вспомогательные функции Rails Ajax: Эти функции предохраняют Rails-разработчиков от сложностей низкоуровневого программирования в Ajax.
  • Центр ресурсов по Ajax: Портал developerWorks Ajax содержит информацию, блоги, форумы и другие ресурсы, посвященные Ajax-программированию.
  • Ajaxian: Этот Ajax-портал является отличным местом для обсуждения всего, что связано с Ajax.
  • Ajax BluePrints: Обсуждение интегрированных Ajax-сред и методики разработки для языка программирования Java.
  • Программирование Ruby (Дэйв Томас (Dave Thomas) и др., Pragmatic Bookshelf, 2005): Популярная книга по программированию в Ruby.
  • Раздел, посвященный Java-технологиям: Сотни статей по каждому аспекту Java-программирования.

Получить продукты и технологии

  • Ruby on Rails: Загрузите Web-среду с открытыми исходным кодом Ruby on Rails.
  • Ruby: Загрузите Ruby с Web-сайта проекта.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Технология Java, XML
ArticleID=200373
ArticleTitle=Пересекая границы: Ajax on Rails
publish-date=03072007