FlashのデータをRails経由でDBに書き込んだり読み出したり

できてしまえば結構簡単だけど、この方式に至るまでが長かった・・・

使うもの

Rails

例としてFlashControllerでデータを受けて、FlashDataモデルのdata属性にデータを保存することにします

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
end

loadってアクション名にすると何かと衝突してエラーになります。注意。

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で保存した値が取得できるので好きなように処理する

以上。