作者aquarianboy (高 见龙)
看板Ruby
标题[心得] 如何在Rails里使用AMF
时间Thu Mar 18 16:59:15 2010
※ [本文转录自 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