RubyAMF 1.0

rubyamf logo
官方網站
顧名思義,ActionScript Message Format(AMF) 對 Ruby 的Gateway, 如先前提過的Weborb作用相同。藉由RubyAMF直接傳遞AS物件到伺服器端,能傳遞的物件也彈性的多,否則,傳統的方法都是用字串、XML等來作資料交換。

我寫下簡單的安裝方法:

工作環境 :: Flex + Ruby on Rails + RubyAMF

  1. 先安裝Flex , Rails(略)
  2. 下載 RubyAMF
  3. 解壓縮 rubyamf1.0.zip, 出現一個目錄叫做:
    rubyamf
  4. 建立一個Rails專案: rails rubyamf_project
  5. 把剛剛解壓縮的目錄複製到: rubyamf_project\vendor\plugins\
  6. 找到rubyamf\services\ruby_amf_controller.rb ,複製到 rubyamf_project\app\controllers\ 下面
  7. 啟動rails server: ruby script/server
  8. 測試: http://localhost:3000/rubyamf/gateway/
    出現:

    Your RubyAMF Flash Remoting gateway is alive and well. See wiki.rubyamf.org for more information.

    就對了!

  9. 伺服器端設定完畢!先寫個簡單的測試Controller:ruby script/generate controller HelloWorld
  10. 編輯剛剛產生的hello_world_controller.rb 寫個簡單的函式:

    def say_hi
    return "Hi from rails + rubyAMF";
    end

  11. 建立Flex 專案,用Flex Builder建一個Basic Project, 我把它叫做"AnotherAMF"
  12. 建立service-config.xml , 如下:
    XML:
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <services-config>
    3.     <services>
    4.         <service id="rubyamf" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">
    5.             <destination id="rubyamf">
    6.                 <channels>
    7.                     <channel ref="rubyamf"/>
    8.                 </channels>
    9.                 <properties>
    10.                     <source>*</source>
    11.                 </properties>
    12.             </destination>
    13.         </service>
    14.     </services>
    15.     <channels>
    16.         <channel-definition id="rubyamf" class="mx.messaging.channels.AMFChannel">
    17.             <endpoint uri="http://localhost:3000/rubyamf/gateway" class="flex.messaging.endpoints.AMFEndpoint"/>
    18.         </channel-definition>
    19.     </channels>
    20. </services-config>

  13. 把剛剛建好的service-config.xml放在專案根目錄下
  14. 打開AnotherAMF專案的"Properties",找到:"Flex Compiler" 下面的 "Additional Compile Arguments" ,貼上這一段:
    -locale en_US -services "service-config.xml"
  15. 建立一個測試的mxml:
    XML:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" verticalAlign="middle" horizontalAlign="center">
    3.  
    4.     <mx:Script>
    5.         <![CDATA[
    6.             import mx.managers.CursorManager;
    7.             import mx.rpc.events.ResultEvent;
    8.             import mx.rpc.events.FaultEvent;
    9.             import mx.rpc.remoting.RemoteObject;
    10.             import mx.controls.Alert;
    11.    
    12.             private function init():void{
    13.                 var ro:RemoteObject = new RemoteObject();
    14.                 ro.destination = "rubyamf";
    15.                 ro.source = "HelloWorldController";
    16.                 ro.say_hi.addEventListener(ResultEvent.RESULT , onLoad);
    17.                 ro.addEventListener(FaultEvent.FAULT , onFault );
    18.                 ro.say_hi();
    19.                 
    20.             }
    21.            
    22.             private function onLoad( event:ResultEvent ):void{
    23.                 Alert.show(event.result.toString());
    24.                 trace( event );
    25.             }
    26.            
    27.             private function onFault( event:FaultEvent ):void{
    28.                 trace( event );
    29.             }
    30.            
    31.         ]]>
    32.     </mx:Script>
    33.  
    34.     <mx:Button id="tester" label="Click For Test" click="init();"/>
    35. </mx:Application>

  16. 完成,執行Run...(記得要啟動rails server喔),應該可以看到從RubyAMF傳回的訊息"Hi from rails + rubyAMF"

官方網站教學(不用Rails)
結論:
剛剛測試的結果,有些時候會出現異常,尤其是在Flex Builder中使用Debug模式,會導致Rails找不到gateway的template...@.@,官方的圖文教學是沒有整合rails的方法,比較精簡。官方還有放 RubyAMF與Flash整合的示範影片,對於長久以來需要和伺服器溝通的Flasher有多一種選擇了。

Leave a Reply