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灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP