AIRアプリケーションとActionWebService間をやり取りするデータ型を生成
ActionWebServiceを通して、AIRアプリケーションからテーブルのレコード作成・更新・削除を行えますが、あらかじめテーブル構造に対応したデータ型を、AIRアプリケーション側でも作成しておく必要があります。
このデータ型を作成するテンプレートを下記に示します。
package
{
public class <%= class_name %>
{
public function <%= class_name %>() {}
<% @model_klass = Module.const_get(class_name) %>
<% for column in @model_klass.columns %>
<% if column.name == "id" %>
public var <%= column.name %>:Number;
<% elsif column.name == "created_at"
or column.name == "updated_at" %>
<% else %>
public var <%= column.name %>:String;
<% end %>
<% end %>
}
}
レコード作成画面を構成するMXMLとAcrtionScriptの生成
レコード作成画面を構成するMXMLとAcrtionScriptを生成するためのテンプレートクラスを下記に示します。
<?xml version="1.0" encoding="utf-8"?> <mx:Window xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
width="300" height="350"
creationComplete="fnCreationComplete()"> <!-- 【1】 --> <mx:Script source="New<%= class_name %>Function.as"/> <% @model_klass = Module.const_get(class_name) %> <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" %> <% else %> <!-- 【4】 --> <% @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 %>" /> <% end %> <% end %> <!-- 【5】 --> <mx:Button click="newItem();" label="新規作成" id="newItemButton" /> </mx:VBox> </mx:Window>
<mx:Script source="New<%= class_name %>Function.as"/>で、MXMLからAcrtionScriptを分離しています。<% for column in @model_klass.columns %>でデータベース上のテーブルにアクセスし、レコードの新規作成に必要なテキストボックスとラベルを生成します。idは新規作成後に振られる番号、created_atとupdated_atはRuby on Railsにより割り当てられる値のため、レコード作成画面ではこれらに対応するコードを生成していません。<% @dict = Dictionary.find_by_english("#{column.name}") %>で、Dictionaryテーブルを使用して英語の列名を日本語に変換しています。newItemで[新規作成]ボタンの押下時にウェブサービスを呼び出し、
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 function fnCreationComplete():void{ } //-------------------------------------------------------------------- // 新規作成 //-------------------------------------------------------------------- // 【5】 private function newItem():void{ webService = new WebService(); webService.wsdl = "http://localhost:3000/<%= file_name %>_service/service.wsdl"; webService.addEventListener(LoadEvent.LOAD, onWSDLCreate); webService.Create.addEventListener(ResultEvent.RESULT, onCreate); webService.loadWSDL(); webService.Create.addEventListener(FaultEvent.FAULT, onFaultCreate); } private function onCreate(event:ResultEvent):void{ Alert.show(event.result.toString()); } private function onFaultCreate(e:FaultEvent):void{ Alert.show("Fault string"+e.fault.faultString); } private function onWSDLCreate(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 %> = 1; <% elsif column.name == "created_at" or column.name == "updated_at" %> <% else %> item.<%= column.name %> = text_<%= column.name %>.text; <% end %> <% end %> webService.Create(item); }
