RailsにFlashからpostしたり取り出したりする
Railsのscaffoldでさくっと作ったインタフェースって、HTTP-POSTからSQLに保存したり取り出したりもできて色々プロトタイプを作るのに便利なのでまとめておく。
ためたデータの管理もできるし。
■Rails側の準備
まずrailsを入れる。
Macの人は既に入っているはず。Windowsなら、ActiveScriptRubyを入れてパス通すと、gemコマンドが入るのでgem install railsすればrailsコマンドが使えるようになる。DBはSQLiteのdll版をc:\windows\system32に入れればできる様になるはず。
railsでtestbbsというプロジェクトを作って、そこにscaffoldでentry(投稿)というmodelを作る。entryには、name(投稿者)とmessage(本文)が入る。
rails testbbs
cd testbbs
ruby script/generate scaffold entry name:string message:text
rake db:migrate
(単数形に注意)
webサーバーを立ち上げる
ruby script/server
http://localhost:3000/entriesから見れるようになっている。はず。(複数形に注意)
こんなページができている。ここからentryを増やしたり消したりもできる。

ここまでで、http://localhost:3000/entries/newから投稿できるのと、http://localhost:3000/entries.xmlから一覧を取得できるようになった。
→Source Code (Ruby on Rails 2.0.2)
■Flashから投稿する
HTTP POSTで行う。
今回作ったもの(動きます)
Source Code (AS3 / Flash CS3 + Flashdevelop)
今回もFlashDevelop上でAS3書いて、FlashCS3オーサリング/コンパイルした。
こいつでPOSTすると、http://localhost:3000/entriesに結果が出るようになる。

どうやってるかというとまず
http://localhost:3000/entries/newを見ると
<form action="/entries" class="new_entry" id="new_entry" method="post"><div style="margin:0;padding:0"><input name="authenticity_token" type="hidden" value="a360f92a6a91d6c588d319f1ab475e9abbb22d9d" /></div>
<p>
<b>Name</b><br />
<input id="entry_name" name="entry[name]" size="30" type="text" />
</p><p>
<b>Message</b><br /><textarea cols="40" id="entry_message" name="entry[message]" rows="20"></textarea>
</p><p>
<input id="entry_submit" name="commit" type="submit" value="Create" />
</p>
</form>
という風にPOSTしているので、entry[name]とentry[message]をパラメータで渡せばいいとわかる。
AS3でhttp postする
var params:URLVariables = new URLVariables();
params.decode("entry[name]=" + _textInputName.text);
params.decode("entry[message]=" + _textAreaPost.text);var request:URLRequest = new URLRequest("http://localhost:3000/entries");
request.method = URLRequestMethod.POST;
request.data = params;
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;urlLoader.load(request);
(Railsの複数形・単数形の変化は注意)
。
返り値を受け取るには、
関数を宣言して
public function onPostComplete(e:Event):void {
var params:URLVariables = new URLVariables(e.target.data);
trace("received: " + unescape(params.toString()));
}
関数をURLLoaderのインスタンスに登録しておけばいい
urlLoader.addEventListener(Event.COMPLETE, onPostComplete); // post完了イベントに関数登録
今回帰ってきた値。HTMLだ。
post from flash
received: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Entries: show</title>
<link href="/stylesheets/scaffold.css?1206748225" media="screen" rel="stylesheet" type="text/css" />
</head>
<body><p style="color: green">Entry was successfully created.</p>
<p>
<b>Name:</b>
shokai
</p><p>
<b>Message:</b>
post from flash
</p><a href="/entries/2/edit">Edit</a> |
<a href="/entries">Back</a></body>
</html>