SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

RoRのWebサービスと連携する、Adobe AIRアプリケーションの自動生成

Adobe AIRアプリケーションの自動生成とWebサービスとの連携

ダウンロード サンプルソース (7.7 KB)

レコード更新画面を構成するMXMLとAcrtionScriptの生成

 レコード更新画面を構成するMXMLとAcrtionScriptを生成するためのテンプレートクラスを下記に示します。

update_mxml.rb
<?xml version="1.0" encoding="utf-8"?>
<mx:Window xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
width="400" height="500"
creationComplete="fnCreationComplete()">
<!-- 【1】 --> <mx:Script source="Update<%= class_name %>Function.as"/> <mx:VBox> <mx:HBox> <mx:Label width="130" text="~の更新" /> </mx:HBox> <!-- 【2】 --> <% for column in @model_klass.columns %> <% if column.name == "id" or column.name == "created_at" or column.name == "updated_at" %> <mx:HBox> <mx:Label width="80" text="ID" id="label_<%= column.name %>" /> <mx:Label id="text_<%= column.name %>" /> </mx:HBox> <% else %> <mx:HBox> <!-- 【3】 --> <% @dict = Dictionary.find_by_english("#{column.name}") %> <% if @dict %> <mx:Label width="80" text="<%= @dict.japanese %>"
id="label_<%= column.name %>" />
<% else %> <mx:Label width="80" text="<%= column.name %>"
id="label_<%= column.name %>" />
<% end %> <mx:TextInput id="text_<%= column.name %>" /> </mx:HBox> <% end %> <% end %> <mx:Button click="updateItem();" label="更新"
id="updateItemButton" />
</mx:VBox> </mx:Window>
  1. <mx:Script source="Update<%= class_name %>Function.as"/>で、MXMLからAcrtionScriptを分離しています。
  2. <% for column in @model_klass.columns %>でデータベース上のテーブルにアクセスし、更新に必要なテキストボックスとラベルを生成します。
  3. <% @dict = Dictionary.find_by_english("#{column.name}") %>で、Dictionaryテーブルを使用して英語の列名を日本語に変換しています。
  4.  
  5. idは新規作成後に振られる番号、created_atupdated_atはRuby on Railsにより割り当てられる値のため、レコード更新画面では表示のみを行うコードを生成しています。
update_function.rb
import mx.rpc.soap.WebService;
import mx.rpc.soap.LoadEvent;
import mx.rpc.Fault;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;

private var webService:WebService;

private var _id:Number;

public function setId(id:Number):void{
  _id = id;
}

private function fnCreationComplete():void{
  text_id.text = String(_id);

  webService = new WebService();
  webService.wsdl =
      "http://localhost:3000/<%= file_name %>_service/service.wsdl";
  webService.addEventListener(LoadEvent.LOAD, onWSDLFindById);
  webService.FindById
      .addEventListener(ResultEvent.RESULT, onFindById);
  webService.loadWSDL();
  webService.FindById
      .addEventListener(FaultEvent.FAULT, onFaultFindById);
}

// 【5】
private function onFindById(event:ResultEvent):void{
  <% @model_klass = Module.const_get(class_name) %>
  <% for column in @model_klass.columns %>
    <% if column.name == "id" %>
    <% elsif column.name == "created_at"
             or column.name == "updated_at" %>
    text_<%= column.name %>.text =
        event.result.<%= column.name %>.getFullYear() + "/" +
        (event.result.<%= column.name %>.getMonth()+1) + "/" +
        event.result.<%= column.name %>.getDate() + " " +
        event.result.<%= column.name %>.getHours() + ":" +
        event.result.<%= column.name %>.getMinutes() + ":" +
        event.result.<%= column.name %>.getSeconds();
    <% else %>
    text_<%= column.name %>.text = event.result.<%= column.name %>;
    <% end %>
  <% end %>
}

private function onFaultFindById(e:FaultEvent):void{
  Alert.show("Fault string"+e.fault.faultString);
}

private function onWSDLFindById(loadEvent:LoadEvent):void{
  webService.FindById(text_id.text);
}

//--------------------------------------------------------------------
// 更新
//--------------------------------------------------------------------
// 【6】
private function updateItem():void{
  webService = new WebService();
  webService.wsdl = 
      "http://localhost:3000/<%= file_name %>_service/service.wsdl";
  webService.addEventListener(LoadEvent.LOAD, onWSDLUpdate);
  webService.Update.addEventListener(ResultEvent.RESULT, onUpdate);
  webService.loadWSDL();
  webService.Update.addEventListener(FaultEvent.FAULT, onFaultUpdate);
}

private function onUpdate(event:ResultEvent):void{
  Alert.show(event.result.toString());
}

private function onFaultUpdate(e:FaultEvent):void{
  Alert.show("Fault string"+e.fault.faultString);
}

private function onWSDLUpdate(loadEvent:LoadEvent):void{
  <% @model_klass = Module.const_get(class_name) %>
  var item:<%= class_name %> = new <%= class_name %>;
  <% for column in @model_klass.columns %>
    <% if column.name == "id" %>
      item.<%= column.name %> = Number(text_id.text);
    <% elsif column.name == "created_at"
             or column.name == "updated_at" %>
    <% else %>
      item.<%= column.name %> = text_<%= column.name %>.text;
    <% end %>
  <% end %>
  webService.Update(item);
}
  1. onFindByIdでレコード更新画面のオープン時にレコードを検索するウェブサービスを呼び出し、レコードを画面上に表示します。
  2. updateItemで[更新]ボタンの押下時にウェブサービスを呼び出し、データベース上のテーブルのレコードを更新します。

アプリケーションを実行するためのXMLの生成

 最後に、アプリケーションを実行するためのXMLを生成するテンプレートを以下に示します。

appxml.rb
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.0">
  <id><%= class_name %></id>
  <version>1.0</version>
  <filename><%= file_name %></filename>
  <name><%= class_name %></name>
  <description><%= class_name %></description>
  <copyright>seiichisan</copyright>

  <initialWindow>
    <title><%= class_name %></title>
    <content><%= class_name %>List.swf</content>
    <systemChrome>standard</systemChrome>
    <transparent>false</transparent>
    <minimizable>true</minimizable>
    <resizable>true</resizable>
    <visible>true</visible>
  </initialWindow>
  <installFolder>./</installFolder>
  <fileTypes>
    <fileType>
      <name>adobe.VideoFile</name>
      <extension>avf</extension>
      <description>Adobe Video File</description>
      <contentType>application/vnd.adobe.video-file</contentType>
    </fileType>
  </fileTypes>
</application>

次のページ
Dictionaryの作成

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

ryujinseiichi(リュウジンセイイチ)

http://ryujinseiichi.sblo.jp/ RubyやAIRなどの新規技術に興味があり、研究を行っています。 最近、seasar2やBPMの研究も始めました。  

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2715 2009/10/20 17:09

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー