Ruby 板


LINE

※ [本文轉錄自 Flash 看板] 作者: aquarianboy (高 見龍) 看板: Flash 標題: [心得] 如何在Rails裡使用AMF 時間: Thu Mar 18 16:58:41 2010 Blog圖文版:http://blog.eddie.com.tw/2010/03/18/rubyamf 如何在Rails裡使用AMF ===== 前言 ===== 常聽很多朋友會問:「flash要怎麼樣跟資料庫串接?」 答案其實很簡單:「不行!目前flash沒辦法直接與資料庫串接」 那到底別人是怎麼做的,為什麼他們的flash可以由後台管理然後更新資料? flash(*.swf) <--> Server端程式(asp, .net, php…etc) <--> DB *.swf透過HTTP GET/POST的方式送給中間的程式 透過中間的程式,flash才得以從資料庫中取出/寫入資料 其中*.swf與server端程式溝通的格式,有簡單的純文字組合 或是用JSON或XML來包裝資料,再餵給*.swf,最後再呈現在flash上 特別是XML對AS3還滿友善的,可以簡單的就取出指定節點的資料 而今天要提的 AMF(Action Message Format) 其實做的工作跟上面的JSON或XML差不多,只是它的格式是binary的 AMF的實作,各家程式語言或Framework都有類似的實作品 像是PHP就有AMFPHP/Zend_Amf,Python有PyAMF,.NET有FluorineFx Ruby 的話則有RubyAMF 不過不管是哪家實作的AMF,流程上都差不多: 1. *.swf連上指定的Gateway 2. 呼叫/執行Gateway上掛載的service,並把所需的參數以AMF格式傳給它(如果有的話) 3. 執行結果回傳 最近手邊有個案子正好是用Rails寫的,剛好有用上AMF,就趁這個機會寫一下心得 免得自己以後忘記 (其實在 Rails裡面,用respond_to直接render產出xml或json也還滿方便的...) ===== 環境 ===== Mac OX 10.6 Rails 2.3.5 ruby 1.8.7 RubyAMF 1.6.5 ===== 安裝 ===== 就不多做Rails的介紹了,直接開個空白的Rails Project來做示範 > rails rubyamf_demo > cd rubyamf_demo 接下來,安裝RubyAMF 網址:http://code.google.com/p/rubyamf/ 個人比較建議直接用script/plugin來安裝,簡單方便 當然如果要自己下載打包檔再手動放進來也ok的 > script/plugin install http://rubyamf.googlecode.com/svn/tags/current/rubyamf 沒問題的話,這個動作就會幫你把rubyamf安裝在vender資料夾裡了 其實這個安裝的過程中,除了把相關檔案裝到vender裡之外 背後有幫忙做了一些事你可能需要知道的: -app/controllers/ 裡多了一個rubyamf_controller.rb 這是整個amf的對外窗口,gateway就是寫在這裡了 -config/ 裡多了一個 rubyamf_config.rb RubyAMF的設定檔,打開這個檔案應該可以看到許多註解說明,可依情況及個人使用 習慣做調整 -config/initializers/mime_types.rb多加了一行 Mime::Type.register "application/x-amf", :amf 到時候可以像 render :text => "hello"一樣,直接用render :amf => "hello"來輸出 -config/route.rb多了一行路徑設定 map.rubyamf_gateway 'rubyamf_gateway', :controller => 'rubyamf', :action => 'gateway' gateway 到時候的位置就是http://127.0.0.1:3000/rubyamf/gateway 接下來試著啟動server,看看能不能正常運作 > script/server 沒問題的話,接著開瀏覽器看看 http://127.0.0.1:3000/rubyamf/gateway/ 如果你看到一個黑色的畫面,中間放著一個RubyAMF的logo 恭喜你,目前這樣就算是把RubyAMF安裝起來了 接下來,就要開始準備寫service上去了 ===== 實作 ===== Rails 部份: 先建立一個model,待會我們會用來取出/寫入資料用的 > script/generate model book author:string content:text 目前只放了author跟content兩個簡單的欄位 (for demo purpose, model部份沒有特別做validation) > rake db:migrate 為了省去另建資料庫的麻煩,這裡直接使用預設的SQLite做為資料庫 table建立後,先塞一筆測試資料進去 > script/console >> Book.create(:author => "eddie", :content => "this is a RubyAMF demo") 再來新增一個controller,裡面放一個hello_world這個action > script/generate controller amf_test hello_world 在hello_world這個action裡,我們加一行: def hello_world render :amf => "Hello AMF" end 大部份網路上看到的範例都是用Flex當範例,不過我個人比較偏好 Flash 以下我就用Flash當做範例示範(其實沒太大差別啦,純粹個人喜好) Flash部份: 範例檔案下載:amf_hello.fla var nc:NetConnection = new NetConnection(); nc.objectEncoding = ObjectEncoding.AMF3; nc.connect('http://127.0.0.1:3000/rubyamf/gateway'); var responder:Responder = new Responder(onOK, onErr); nc.call('AmfTestController.hello_world', responder); function onOK(res:Object):void { trace(res); } function onErr(res:Object):void { trace("Error!"); } 其中比較需要注意的是nc.call那一段 直接呼叫ControllerName.ActionName就行了 按下Ctrl+Enter之後,應該就可以看到"Hello AMF"的字樣了 代表你的swf已經可以成功從AMF Gateway讀資料回來了 如果這裡有發生錯誤,可能檢查一下是不是有打錯字,或是server忘了啟動 接下來,我們試著送資料給gateway,讓它寫入資料庫之後再回傳目前資料庫裡的書 總共有幾本 這次我們先做flash端的介面,我放了一個按鈕跟二個輸入框 instance name分別取名為add_btw、author_txt及content_txt (檔名:amf_addbook.fla) AS3語法如下: add_btn.addEventListener(MouseEvent.CLICK, click_handler); function click_handler(evt:MouseEvent):void { var nc:NetConnection = new NetConnection(); nc.objectEncoding = ObjectEncoding.AMF3; nc.connect('http://127.0.0.1:3000/rubyamf/gateway'); var amf_object:Object = { 'author': author_txt.text, 'content': content_txt.text }; var responder:Responder = new Responder(onOK, onErr); nc.call('AmfTestController.add_book', responder, amf_object); } function onOK(res:Object):void { trace("目前共有" +res +"本書"); } function onErr(res:Object):void { trace("fail"); } 其實只是把呼叫的部份放到click handler裡,並且在裡面做了一個object, 並且在呼叫的時候 nc.call('AmfTestController.add_book', responder, amf_object); 把它當做參數傳出去 接下來,在Rails裡,我們要來加一個add_book這個action,準備接收資料 def add_book if is_amf Book.create(:author => params[0][:author], :content => params[0][:content]) render :amf => Book.count else render :text => "error" end end 這裡可以用is_amf來檢查傳進來的是不是AMF 傳進來的參數可用 params[0] 取得 接著執行flash,沒問題的話,當每次按下Add Book按鈕時,它就會把author跟 content資料寫入DB,並回傳目前總筆數 以上為展示目的,都沒有加資料的驗證,所以就算空白資料也可以送出 以上是一些個人小小的心得,供大家參考囉 相關網站: http://blog.rubyamf.org/ http://code.google.com/p/rubyamf/ 原始檔下載(fla + rails project): http://nayumi.myweb.hinet.net/downloads/sample.zip -- http://blog.eddie.com.tw/ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.5.183 -- http://blog.eddie.com.tw/ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.5.183
1F:→ aquarianboy:希望對有需要的朋友有幫助囉 :) 03/18 16:59
2F:推 dickstar:謝謝分享 04/13 02:45







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP