Flex для Ruby on Rails

Октябрь 26, 2008 8:49 пп автор Артем Голубев  |  Рубрики: RubyOnRails  |  Метки:  

Введение

Flex - это очень продвинутая версия всем хорошо известного Flash, откомпилированный байт-код которого работает на Flash интерпретаторах. Т.е. вы используете приличный язычек для того, чтобы написать толстенького клиентика, а потом компилируете его в SWF файл который работает как обычный Flash. С Flex-ом есть только одна засада: приличный IDE для него платный. Flex компилятор сам по себе бесплатный.

Flex к RoR можно привинтить по крайней мере 3 способами:

  1. Самописным сервисом
  2. WebService возможностями RoR
  3. При помощи проприетарного бинарного протокола AMF3 или AMF0 работающего поверх HTTP

О первом способе говорить ничего не буду, т.к. никогда не занимался, 2-й дествительно работает без всяких добавочных библиотек, проблема только в том, что он будет всегда гонять тучки жирненького XML-а по сети, а вот о 3-м способе сейчас Вы сможете узнать поподробнее.

Сначала немножко о стандартах:
AMF0 - это доставшийя в наследство от Flash слегка устаревший протокольчик, необходимый только если вы из каких-то мазохистских соображений вдруг решите писать на Flash вместо Flex. AMF3, соответственно, более новый и продвинутый протокольчик, которым вы, по-видимому, и будете пользоваться. Мне известен только один плагин для RoR который позволяет использовать AMF3 для доступа из флекса к рубиевским серверным кодам: это WebORB.

WebORB для Ruby on Rails - это реализация RPC функциональности Adobe’s Flex Data Services. Используя WebORB Ruby разработчик может интегрировать клиентские приложения на Flex с сервисами, заделоиными в Rails приложениях.

Этот пост предлагает обзор процесса создания Flex RPC клиента, используя Flex Builder 3.0 и соединения его с приложением на Ruby on Rails. В результате рассмотренных шагов Вы получите приложение на Flex, общающееся с Ruby объектом в Rails через WebORB.

Инсталляция WebORB

Убедитесь, что у Вас уже установлено:

  • Ruby версии 1.8 или новее
  • Ruby on Rails версии 1.1.4 или новее

Здесь находится достаточно полная документация по WebORB и его привинчиванию к RoR.

Мы же с вами разберем эту статейку о том как начать работу с WebORB. Часть картинок взята с оригинального сайта (http://www.themidnightcoders.com/weborb/rubyonrails/gettingstarted.htm).

Итак, задача: установить WebORB плагин к RoR и законнектится Flex-овым приложением к RoR серверу. Сразу оговорка: мы будем использовать Flex Builder для того, чтобы создать Flex приложение. Как поставить RoR описано тут.

Создание Rails приложения

После того, как Ruby and Rails и Flex Builder у Вас уже установлены, можно перейти к созданию приложения Rails.

Создаем новое приложение так:
 

> rails myrailsapp

gettin2.jpg

Затем переходим из текущей папки в папку новосозданного приложения и запускаем команду для скачки и установки плагина WebORB в текущее Rails приложение:
 

> ruby script/plugin install http://themidnightcoders.net:8089/svn/weborb

gettin3.jpg

Теперь WebORB проинсталлирован и готов обрабатывать Flex и Flash удаленные вызовы. Запустите web-сервер Rails приложения командой “ruby script/server”:
 

> ruby script/server

gettin4.jpg

Вы можете проверить, что приложение было создано и плагин проинсталлирован корректно при помощи запуска тестового приложения, которое идет в составе плагина WebORB. Откройте http://localhost:3000/examples/main.html в Вашем браузере. Если приложение загружено корректно, то вы сможете запустить различные тесты. Каждый тест вызывает методы Ruby классов, установленных вместе с плагином WebORB.

Создание Flex приложения

Запускаем Flex Builder, выбираем в меню File->New->Flex project,
gettin5.png

Задаем имя проекта, например SampleFlexToRubyProject, выбираем Application Server Type: Other, жмем Next,
gettin6.png

Следующий шаг в создании Flex проекта - указать папку, куда будут складываться откомпилированные файлы и URL, который будет соответствовать этой папке. Для того, чтобы папка была доступна из Rails приложения она должна находиться в подпапке /public внутри Вашего приложения (в нашем случае это будет c:\ruby\myrailsapp\public). Не забудьте, что URL должен соответствовать указанной Вами папке.

Выбираем куда у нас будут складываться откомпилированные файлы, например

c:\ruby\myrailsapp\public\examples

жмем Next,
gettin7.png

Внизу выбираем URL который будет соответствовать папке c:\ruby\myrailsapp\public\examples, указанной не предыдущем шаге http://localhost:3000/examples, жмем Finish.
gettin8.png

После того, как Вы нажали ‘Finish’, Flex Builder создаст пустое Flex приложение. Шаги, описанные ниже, помогут Вам создать Flex приложение которое будет соединяться с Ruby объектом на Rails сервере.

WebORB для Rails содержит пример Flex приложения демонстрирующий работу Flex с WebORB для удаленных вызовов. Скопируйте содержимое файла example.mxml из папки

\public\examples\

в файл mxml который создался во Flex Builder-е. Код приложения соединяется c Ruby объектами и получает информацию о компьютере, на котором работают эти руби-объекты.

Конфигуриция WebORB

Для работы с RoR Flex приложение требует описания классов как сервисов, с которыми будет происходить работа как “destinations”. Они должны быть сконфигурированы в файле remoting-config.xml расположенном в папке \config\WEB-INF\flex. В данном примере приложение использует сервис “InfoService”, определенный для класса “InfoService” следующим образом:

 <destination id=”InfoService”>

   <properties>
     <source>InfoService</source>
   </properties>
</destination>

Flex Builder подгружает эту конфигурацию во время компиляции проекта.

Когда Вы запускаете приложение во Flex Builder, оно открывается в окне браузера и подгружает Ваше приложение:
http://localhost:3000/examples/SampleFlexToRubyProject.html

Приложение соеденяется с RoR сервисом во время запуска или когда юзер нажмет на кнопку “Send Request”.

Обзор кода

Flex приложение объявляет удаленный объект используя RemoteObject API:

remoteObject = new RemoteObject();
remoteObject.destination = “InfoService”;
remoteObject.getComputerInfo.addEventListener(”result”, onResult);
remoteObject.addEventListener(”fault”, onFault);

Обратите внимание, что имя destination соответствует destination объявленном в remoting-config.xml.
Когда пользователь ныжимает кнопку ‘Get Computer Info’, следующая функция производит удаленный вызов:

private function getInfo():void
{
  invokeButton.enabled = false;
  serverInfoText.text = “”;
  requestIdText.text = “”;
  osText.text = “”;
  timeText.text = “”;
  remoteObject.getComputerInfo(”ABC123″);
}

Когда приложение получает ответ от сервера, Flex вызывает обработчик ответа определенный в тэге “RemoteObject”. В данном примере обработчик ответа достает текстовые поля из объекта, пришедшего с сервера:

private function onResult(event:ResultEvent):void
{
  var computerInfo:Object = event.result;
  serverInfoText.text = computerInfo.serverName;
  requestIdText.text = computerInfo.requestId;
  osText.text = computerInfo.os;
  timeText.text = computerInfo.currentTime.toString();
  invokeButton.enabled = true;
}

Исходный код для серверной стороны такой:

require ‘weborb/context’
require ‘rbconfig’

class InfoService
  def getComputerInfo( requestId )
    computer_info = Hash.new
    request = RequestContext.get_request
    computer_info['serverName'] = request.server_software
    computer_info['requestId'] = requestId
    computer_info['os'] = Config::CONFIG["arch"].to_s
    computer_info['currentTime'] = Time.now
    computer_info
  end
end

Соответствие типов

Соответствие типов Flex - Ruby я разбирал тут:

  1. int - Fixnum
  2. Numeric - Float
  3. Date - Time
  4. String - String
  5. Boolean - Boolean
1 Star2 Stars3 Stars4 Stars5 Stars (14 votes, average: 4.36 out of 5)
Loading ... Loading ...

Добавить комментарий »

( Comment от Олег Курносов — Октябрь 29, 2008 @ 4:44 пп )
( Comment от Артем Голубев — Октябрь 29, 2008 @ 4:53 пп )

Оставить комментарий