FlashのデータをRails経由でDBに書き込んだり読み出したり
できてしまえば結構簡単だけど、この方式に至るまでが長かった・・・
Rails側
例としてFlashControllerでデータを受けて、FlashDataモデルのdata属性にデータを保存することにします
- rubyamfプラグインをインストール
script/plugin install http://rubyamf.googlecode.com/svn/trunk/rubyamf
- FlashDataのdata属性にオブジェクトをシリアライズして保存するように指定
class FlashData < ActiveRecord::Base serialize :data end
- FlashControllerにload_data/save_dataアクションを作成(名前は何でもいいです)
def load_data render :amf => FlashData.find(params[0][:id]).data end def save_data render :amf => FlashData.create(params[0]).id endloadってアクション名にすると何かと衝突してエラーになります。注意。
Rails側は以上
Flex側
SWFはRAILS_ROOT/public以下においてください。
- ssrをダウンロードしてパスを通す
- 諸々インポート
import com.niarbtfel.remoting.RemotingConnection; import com.niarbtfel.remoting.RemotingService; import com.niarbtfel.remoting.events.ResultEvent; import com.niarbtfel.remoting.events.FaultEvent;
- リモートサービスオブジェクトをインスタンス変数として保持
private static var GATEWAY_URL:String = 'http://192.168.0.1:3000/rubyamf/gateway'; private static var SERVER_NAME:String = 'FlashController'; private var remotingService:RemotingService;
- コンストラクタでリモートサービスオブジェクトを初期化
var waitingTime:int = 4000; var retry:int = 3; remotingService = new RemotingService( new RemotingConnection(GATEWAY_URL), SERVER_NAME, waitingTime, retry );
- データを保存
var params:Object = {data:objectWhichYouWantToStore}; remotingService.apply( 'save_data', [params], function(evt:ResultEvent):void{dataId = evt.result}, function(evt:FaultEvent):void{trace('fault')} );
- データを読込 (dataIdは保存したときに得た値)
remotingService.apply( 'load_data', [{id:dataId}], function(evt:ResultEvent):void{var data:Object = evt.result}, function(evt:FaultEvent):void{trace('fault')} );ResultEvent#resultで保存した値が取得できるので好きなように処理する
以上。