Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 2

前回の続きで、今回はクライアントサイドのFlexの実装をしましょう。

FlexにはEclipseベースのFlex Builderという有償(30,000円~)の開発環境が用意されてますが、今回は無償で使えるFlex SDKだけでやりましょう。これを使えばコマンドラインでコンパイルできます。

ちなみに今回は使いまんせがFlex Builder 3 beta3のダウンロードはここからできます。

準備 (Flex 3 beta3 の SDK)

Adobe LabsFlex 3 SDKダウンロードページからDownload Flex 3 SDK 3 beta 3 for all platformsをダウンロード&解凍して適当なディレクトリに配置します。

僕の場合は、D:\flex\の中に入れました。

画面キャプチャ

さて、コマンドラインで使えるように、パスを通しましょう。

Windows XPの僕のマシンの場合、環境変数PATHにD:\flex\flex3sdk_b3_121207\bin\をセットしました。

画面キャプチャ

準備 (Flash Player)

Flash Playerのバージョンを確認。バージョン確認ページ

画面キャプチャ

9.0.28未満の場合は、新しいバージョンのFlash Playerをインストール必要があります。 開発時はDebug版のFlash Playerの方が便利なので、バージョンの問題がない場合も含めて最新(現在は9.0.115)のDebug版Flash Playerをインストールしておくといいでしょう。

さっきダウンロードしたSDKの中にそのインストーラが入ってます。 僕の場合、D:\flex\flex3sdk_b3_121207\runtimes\player\以下にあります。

Flexを知らない人のために

FlexにはボタンやチェックボックスなどのUIコンポーネントや、通信のためのコンポーネントなどアプリケーションのインタフェースを作る上で便利なものがいっぱい用意されてます。

どんなものがあるかはFlex 3 Compon Entexplorerを見るのがいいでしょう。UIコンポーネントはCSSによるスタイル変更も可能で、それはFlex Style Explorerで動的に確認できます。

ちなみにこのStyle Explorerはソース付きで、画面上で右クリックしてメニューの「View Source」でソースの閲覧&ダウンロードができます。

画面キャプチャ

画面キャプチャ

Flexの実装

Flexのソースファイルを置くところはどこでもいいのですが、僕の場合は、D:\rails\rails2restful\にflex_srcというフォルダを作りました。

その中にRails2RESTful.mxmlというテキストファイルを作り、以下のコードを入力します。文字コードはUTF-8。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
		initialize="listBookmarks()">
	<mx:Script>
	<![CDATA[
		import mx.controls.Alert;
		import mx.events.CloseEvent;
		import mx.rpc.AsyncResponder;
		import mx.rpc.AsyncToken;
		private function listBookmarks():void
		{
			listBookmarksHS.url = "/bookmarks.xml";
			listBookmarksHS.method = "GET";
			var call:AsyncToken = listBookmarksHS.send();
			call.addResponder(new AsyncResponder(
				function (result:Object, token:Object = null):void
				{
					Alert.show(result.toString(), "listBookmarks 成功");
				},
				function (error:Object, token:Object = null):void
				{
					Alert.show(error.toString(), "listBookmarks エラー");
				},
				call
			));
		}
		private function createBookmark():void
		{
			var request:XML = 
				<bookmark>
					<name>{ nameTextInput.text }</name>
					<url>{ urlTextInput.text }</url>
				</bookmark>;
			createBookmarkHS.contentType = "application/xml";
			createBookmarkHS.url = "/bookmarks.xml";
			createBookmarkHS.method = "POST";
			var call:AsyncToken = createBookmarkHS.send(request);
			call.addResponder(new AsyncResponder(
				function (result:Object, token:Object = null):void
				{
					Alert.show(result.toString(), "createBookmark 成功", 4, null, 
						function (event:CloseEvent):void
						{
							listBookmarks();
						});
				},
				function (error:Object, token:Object = null):void
				{
					Alert.show(error.toString(), "createBookmark エラー");
				},
				call
			));
		}
		private function updateBookmark():void
		{
			var request:Object = {};
			request["_method"] = "PUT";
			request["bookmark[name]"] = nameTextInput.text;
			request["bookmark[url]"] = urlTextInput.text;
			updateBookmarkHS.url = "/bookmarks/" + dataGrid.selectedItem.id + ".xml";
			updateBookmarkHS.method = URLRequestMethod.POST;
			var call:AsyncToken = updateBookmarkHS.send(request);
			call.addResponder(new AsyncResponder(
				function (result:Object, token:Object = null):void
				{
					Alert.show(result.toString(), "updateBookmark 成功", 4, null, 
						function (event:CloseEvent):void
						{
							listBookmarks();
						});
				},
				function (error:Object, token:Object = null):void
				{
					Alert.show(error.toString(), "updateBookmark エラー");
				},
				call
			));
		}
		private function destroyBookmark():void
		{
			var request:Object = {};
			request["_method"] = "DELETE";
			destroyBookmarkHS.url = "/bookmarks/" + dataGrid.selectedItem.id + ".xml";
			destroyBookmarkHS.method = URLRequestMethod.POST;
			var call:AsyncToken = destroyBookmarkHS.send(request);
			call.addResponder(new AsyncResponder(
				function (result:Object, token:Object = null):void
				{
					Alert.show(result.toString(), "destroyBookmark 成功", 4, null, 
						function (event:CloseEvent):void
						{
							listBookmarks();
						});
				},
				function (error:Object, token:Object = null):void
				{
					Alert.show(error.toString(), "destroyBookmark エラー");
				},
				call
			));
		}
	]]>
	</mx:Script>
	
	<mx:HTTPService id="listBookmarksHS" useProxy="false" showBusyCursor="true" />
	<mx:HTTPService id="createBookmarkHS" useProxy="false" showBusyCursor="true" />
	<mx:HTTPService id="updateBookmarkHS" useProxy="false" showBusyCursor="true" />
	<mx:HTTPService id="destroyBookmarkHS" useProxy="false" showBusyCursor="true" />
	
	<mx:Button label="最新" top="8" right="8" click="listBookmarks()" />
	<mx:DataGrid id="dataGrid" left="8" top="40" right="8" bottom="120"
		dataProvider="{ listBookmarksHS.lastResult.bookmarks.bookmark }"/>
	<mx:Form left="8" right="8" bottom="8">
		<mx:FormItem label="名前">
			<mx:TextInput id="nameTextInput" text="{ dataGrid.selectedItem.name }" />
		</mx:FormItem>
		<mx:FormItem label="URL">
			<mx:TextInput id="urlTextInput" text="{ dataGrid.selectedItem.url }" />
		</mx:FormItem>
		<mx:FormItem direction="horizontal">
			<mx:Button label="新規追加" click="createBookmark()" />
			<mx:Button label="更新" click="updateBookmark()" />
			<mx:Button label="削除" click="destroyBookmark()" />
		</mx:FormItem>
	</mx:Form>
</mx:Application>

コマンドラインでコンパイル

D:\rails\rails2restful>mxmlc flex_src\Rails2RESTful.mxml
Loading configuration file D:\flex\flex3sdk_b3_121207\frameworks\flex-config.xml

This beta will expire on Sat Mar 15 00:00:00 JST 2008.
D:\rails\rails2restful\flex_src\Rails2RESTful.swf (321711 bytes)

ブラウザで確認するための準備

できたSWFファイルをRailsのpublicフォルダにコピー。 僕の場合は、D:\rails\rails2restful\public\以下にコピー。

同フォルダにSWFを表示するためのhtmlファイル、flex.htmlを作ります。以下はソース。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
body { margin: 0px; overflow:hidden }
</style>
</head>
<body scroll="no">
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
        id="Rails2RESTful" width="100%" height="100%"
        codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
        <param name="movie" value="Rails2RESTful.swf" />
        <param name="quality" value="high" />
        <param name="bgcolor" value="#869ca7" />
        <param name="allowScriptAccess" value="sameDomain" />
        <embed src="Rails2RESTful.swf" quality="high" bgcolor="#869ca7"
            width="100%" height="100%" name="Rails2RESTful" align="middle"
            play="true"
            loop="false"
            quality="high"
            allowScriptAccess="sameDomain"
            type="application/x-shockwave-flash"
            pluginspage="http://www.adobe.com/go/getflashplayer">
        </embed>
    </object>
</body>
</html>

ブラウザで確認

http://localhost:3000/flex.htmlを開く。

画面キャプチャ

データ取得OK。 データの新規追加、更新、削除も動作確認。

画面キャプチャ

ほぼ問題なし、だけど、データの新規追加のときだけ、エラーが発生する。 これについては、次回で。

つづく。

カテゴリ

,

トラックバック(3)

このブログ記事を参照しているブログ一覧: Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 2

このブログ記事に対するトラックバックURL: http://uenon.jp/mt/mt-tb.cgi/92

昨日、Rails勉強会@東京第25回に参加してきました。 「TrackBackを... 続きを読む

今回は前回の最後にでてきた問題(新規追加時のエラー)とその回避方法についてまと... 続きを読む

» Flex3勉強会第33回で話したことメモ(FleFla)~のトラックバック

Flex3勉強会第33回(アンケート結果)でRails + FlexとLogg... 続きを読む

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、Naohiko Uenoが2007年12月18日 07:26に書いたブログ記事です。

ひとつ前のブログ記事は「Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 1」です。

次のブログ記事は「Rails 2.0.2にアップデート」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.1