<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>里克的自习室 &#187; remoting</title>
	<atom:link href="http://railser.cn/blog/tag/remoting/feed" rel="self" type="application/rss+xml" />
	<link>http://railser.cn</link>
	<description>关注Ruby和Rails的学习与开发</description>
	<lastBuildDate>Tue, 20 Dec 2011 11:47:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>在Rails中使用Flash Remoting中文教程</title>
		<link>http://railser.cn/blog/flash-remoting-for-rails-tutorial-chinese</link>
		<comments>http://railser.cn/blog/flash-remoting-for-rails-tutorial-chinese#comments</comments>
		<pubDate>Mon, 22 Oct 2007 11:20:04 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[remoting]]></category>

		<guid isPermaLink="false">http://railser.cn/archives/flash-remoting-for-rails-tutorial-chinese</guid>
		<description><![CDATA[src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> 原文：Flash Remoting for Rails Tutorial 里克：1、Flash Remoting从flash player6就开始了，Flex Client是个新家伙。2、Flash Remoting如何翻译？我想翻译为flash远程。 在我们使用Rails的时候，可能会忽视掉另一个开发工具：Flash Remoting。长期的使用xml，可能会改变你的编程习惯。就像作者引用的那句话："If all you have is a hammer everything looks like a nail"。Remoting可以直接向flash传递对象，数组。Remoting使用AMF(Active Message Format)传递byte流，这比使用xml要快很多。 而且在06年8月，Midnight Coders发布了他们的WebORB插件。 他们的例子是基于Flex2的，这需要客户端安装Flash player9.0，这并不有好，因为Remoting在Flash player6中就已经开始使用了。所以这里我们只拿我们需要的。 如果你之前没有使用过Flash Remoting，请先安装Remoting Components。 这里我们制作一个flash的mp3播放器，用rails作为后端服务。点击这里，你可以下载这个例子的代码。 创建一个应用：mp3app &#160; &#38;gt; rails mp3app &#38;gt; cd mp3app 安装weborb插件 &#160; &#38;gt; ruby script/plugin install http://themidnightcoders.net:8089/svn/weborb 创建一个名为‘mp3app_development’的数据库 &#160; CREATE TABLE `tracks` [...]]]></description>
			<content:encoded><![CDATA[<pre>
<script type="text/javascript"><!--
google_ad_client = "pub-7545275883969710";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
</script>
<script type="text/javascript">
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></pre>
<p>原文：<a href="http://blog.vixiom.com/2006/08/23/flash-remoting-for-rails-tutorial/" target="_blank">Flash Remoting for Rails Tutorial</a></p>
<p>里克：1、Flash Remoting从flash player6就开始了，Flex Client是个新家伙。2、Flash Remoting如何翻译？我想翻译为flash远程。</p>
<p>在我们使用Rails的时候，可能会忽视掉另一个开发工具：Flash Remoting。长期的使用xml，可能会改变你的编程习惯。就像作者引用的那句话："If all you have is a hammer everything looks like a nail"。Remoting可以直接向flash传递对象，数组。Remoting使用AMF(Active Message Format)传递byte流，这比使用xml要快很多。</p>
<p>而且在06年8月，<a href="http://www.themidnightcoders.com/">Midnight Coders</a>发布了他们的WebORB插件。</p>
<p>他们的例子是基于Flex2的，这需要客户端安装Flash player9.0，这并不有好，因为Remoting在Flash player6中就已经开始使用了。所以这里我们只拿我们需要的。</p>
<p>如果你之前没有使用过Flash Remoting，请先安装<a href="http://www.adobe.com/products/flashremoting/downloads/components/">Remoting Components</a>。</p>
<p>这里我们制作一个flash的mp3播放器，用rails作为后端服务。<a href="http://blog.vixiom.com/uploads/mp3app.zip">点击这里</a>，你可以下载这个例子的代码。</p>
<p>创建一个应用：mp3app</p>
<blockquote>
<pre class="ruby">&nbsp;
&amp;gt; rails mp3app
&amp;gt; cd mp3app</pre>
</blockquote>
<p>安装weborb插件</p>
<blockquote>
<pre class="ruby">&nbsp;
&amp;gt; ruby script/plugin install http://themidnightcoders.<span style="color:#9900CC;">net</span>:<span style="color:#006666;">8089</span>/svn/weborb</pre>
</blockquote>
<p>创建一个名为‘mp3app_development’的数据库</p>
<blockquote>
<pre class="ruby">&nbsp;
CREATE TABLE <span style="color:#996600;">`tracks`</span> <span style="color:#006600; font-weight:bold;">&#40;</span>
  <span style="color:#996600;">`id`</span> int<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">11</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">NOT</span> NULL auto_increment,
  <span style="color:#996600;">`title`</span> varchar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">50</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">NOT</span> NULL default <span style="color:#996600;">''</span>,
  <span style="color:#996600;">`artist`</span> varchar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">50</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">NOT</span> NULL default <span style="color:#996600;">''</span>,
  <span style="color:#996600;">`album_art`</span> varchar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">50</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">NOT</span> NULL default <span style="color:#996600;">''</span>,
  <span style="color:#996600;">`filename`</span> varchar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">50</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">NOT</span> NULL default <span style="color:#996600;">''</span>,
  PRIMARY KEY  <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">`id`</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">&#41;</span> ENGINE=MyISAM DEFAULT CHARSET=latin1;
&nbsp;
insert into <span style="color:#996600;">`tracks`</span> values
<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'1'</span>,<span style="color:#996600;">'After Midnight'</span>,<span style="color:#996600;">'Eric Clapton'</span>,<span style="color:#996600;">'clapton.jpg'</span>,<span style="color:#996600;">'AfterMidnight.mp3'</span><span style="color:#006600; font-weight:bold;">&#41;</span>,
 <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'2'</span>,<span style="color:#996600;">'Midnight Train to Georgia'</span>,<span style="color:#996600;">'Gladys Knight'</span>,<span style="color:#996600;">'gladys.jpg'</span>,
<span style="color:#996600;">'MidnightTrainToGeorgia.mp3'</span><span style="color:#006600; font-weight:bold;">&#41;</span>,
 <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'3'</span>,<span style="color:#996600;">'Midnight In A Perfect World'</span>,<span style="color:#996600;">'DJ Shadow'</span>,<span style="color:#996600;">'shadow.jpg'</span>,
<span style="color:#996600;">'MidnightInAPerfectWorld.mp3'</span><span style="color:#006600; font-weight:bold;">&#41;</span>,
 <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'4'</span>,<span style="color:#996600;">'Two Minutes to Midnight'</span>,<span style="color:#996600;">'Iron Maiden'</span>,<span style="color:#996600;">'maiden.jpg'</span>,
<span style="color:#996600;">'TwoMinutesToMidnight.mp3'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</pre>
</blockquote>
<p>创建‘Track’model</p>
<blockquote>
<pre class="ruby">&nbsp;
&amp;gt; ruby script/generate model Track</pre>
</blockquote>
<p>在‘app/services’目录下创建一个Remoting services服务，文件为：'TrackService.rb'</p>
<blockquote>
<pre class="ruby">&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'weborb/context'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rbconfig'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> TrackService
   <span style="color:#9966CC; font-weight:bold;">def</span> getTracks
     tracks = Track.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span><span style="color:#006600; font-weight:bold;">&#41;</span>
   <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre>
</blockquote>
<p>如果你曾经用过<a href="http://amfphp.org/">AMFPHP</a>或者.net下的Remoting，上面的这个服务端可以说是“相当”简单了。但是你可以运行测试一下。</p>
<p>下面进入到我们的Flash。<br />
对于Flash应用，有几个<strong>框架</strong>可供选择，比如<a href="http://ariaware.com/products/arp/">ARP</a>和 <a href="http://www.iterationtwo.com/open_source_cairngorm.html">Cairngorn</a>。但是在我们这个应用上，他们显得太过强大了。我们可以写一个自己的轻量级的框架。这是一种MVC框架，Model是一个Remoting Class，用来和后台程序沟通(PHP, .NET, 或者 我们的 Rails) ，一个.fla的controller，和一个View class。<br />
M 和 V 在 C 的控制下进行事件相应与处理，而其他的类来扩展其他的功能。</p>
<p>基本的Remoting是这样：</p>
<blockquote>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">Service</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">services</span>.<span style="color: #0066CC;">Log</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">PendingCall</span>;;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">RelayResponder</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">FaultEvent</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">ResultEvent</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">debug</span>.<span style="color: #006600;">NetDebug</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Delegate</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> com.<span style="color: #006600;">vixiom</span>.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">Remoting</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> gatewayURL:<span style="color: #0066CC;">String</span>;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> servicePath:<span style="color: #0066CC;">String</span>;
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> svc:Service;
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #000000; font-weight: bold;">function</span> addEventListener<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #000000; font-weight: bold;">function</span> removeEventListener<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
    * Constructor
    *
    *   @param      gURL    gatewayURL
    *   @param      sp      service path
    *   @param      u       username
    *   @param      p       password
    *
    */</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Remoting<span style="color: #66cc66;">&#40;</span>gURL, sp, u, p<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        gatewayURL = gURL;
        servicePath = sp;
&nbsp;
        <span style="color: #808080; font-style: italic;">// initialize as a broadcaster</span>
        mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">EventDispatcher</span>.<span style="color: #006600;">initialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #808080; font-style: italic;">// create a new service</span>
        svc = <span style="color: #000000; font-weight: bold;">new</span> Service <span style="color: #66cc66;">&#40;</span>gatewayURL, <span style="color: #000000; font-weight: bold;">null</span>, servicePath, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #808080; font-style: italic;">// credentials</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>u != <span style="color: #0066CC;">undefined</span> &amp;amp;&amp;amp; p != <span style="color: #0066CC;">undefined</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            svc.<span style="color: #006600;">connection</span>.<span style="color: #006600;">setCredentials</span><span style="color: #66cc66;">&#40;</span>u, p<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
    * Global fault event
    */</span>
    <span style="color: #000000; font-weight: bold;">function</span> handleRemotingError<span style="color: #66cc66;">&#40;</span>fault:FaultEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Void</span>
    <span style="color: #66cc66;">&#123;</span>
        mx.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">debug</span>.<span style="color: #006600;">NetDebug</span>.<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><span style="color: #0066CC;">level</span>:<span style="color: #ff0000;">&quot;None&quot;</span>,
        <span style="color: #0066CC;">message</span>:<span style="color: #ff0000;">&quot;Error: &quot;</span> +
        fault.<span style="color: #006600;">fault</span>.<span style="color: #006600;">faultstring</span> <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
    * Event dispatcher
    *
    *   @param      d       data
    *   @param      et      eventType
    *
    */</span>
    <span style="color: #000000; font-weight: bold;">function</span> dispatch<span style="color: #66cc66;">&#40;</span>d, et<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">// broadcast message</span>
        <span style="color: #000000; font-weight: bold;">var</span> eventObj:<span style="color: #0066CC;">Object</span>=<span style="color: #66cc66;">&#123;</span><span style="color: #0066CC;">target</span>:<span style="color: #0066CC;">this</span>,<span style="color: #0066CC;">type</span>:et<span style="color: #66cc66;">&#125;</span>
        eventObj.<span style="color: #0066CC;">data</span> = d;
        dispatchEvent<span style="color: #66cc66;">&#40;</span>eventObj<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre>
</blockquote>
<p>基本的View Class是这样：</p>
<blockquote>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Delegate</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> com.<span style="color: #006600;">vixiom</span>.<span style="color: #006600;">view</span>.<span style="color: #006600;">View</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">target</span>:<span style="color: #0066CC;">MovieClip</span>;
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #000000; font-weight: bold;">function</span> addEventListener<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #000000; font-weight: bold;">function</span> removeEventListener<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
    * Constructor
    *
    *   @param  t   target (target timeline: _root || a mc)
    */</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> View <span style="color: #66cc66;">&#40;</span>t:<span style="color: #0066CC;">MovieClip</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">target</span> = t;
&nbsp;
        <span style="color: #808080; font-style: italic;">// initialize as a broadcaster</span>
        mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">EventDispatcher</span>.<span style="color: #006600;">initialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
    * Event dispatcher
    *
    *   @param      d       data
    *   @param      et      eventType
    *
    */</span>
    <span style="color: #000000; font-weight: bold;">function</span> dispatch<span style="color: #66cc66;">&#40;</span>d, et<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">// broadcast message</span>
        <span style="color: #000000; font-weight: bold;">var</span> eventObj:<span style="color: #0066CC;">Object</span>=<span style="color: #66cc66;">&#123;</span><span style="color: #0066CC;">target</span>:<span style="color: #0066CC;">this</span>,<span style="color: #0066CC;">type</span>:et<span style="color: #66cc66;">&#125;</span>
        eventObj.<span style="color: #0066CC;">data</span> = d;
        dispatchEvent<span style="color: #66cc66;">&#40;</span>eventObj<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
</blockquote>
<p>里克：看到这个时候，我看了一下源代码。as文件的存放是按照类似java的形式。所以下面的话就好理解了。我对as的知识为0.</p>
<p>在这个MP3 player中，我用下面的方法扩充一下Remoting class。你可以不必把你的类放到这个packages里面，当然那样做更利于管理。</p>
<pre class="actionscript"><span style="color: #ff0000;">'var pc:PendingCall = this.svc.getTracks();'</span></pre>
<p>一句是再远程调用Rails，这和TrackService.rb 类里面的'getTracks'是一样的。我的类中有一个tracks对象，它直接接收ruby的'tracks = re.result;'。我注释了'this.svc.connection.setCredentials(u, p);'一行，因为它在创建一个安全的远程调用。最后一行'dispatch(tracks, "onGetTracks");' 将数据传递给view。</p>
<blockquote>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">*</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">*</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> com.<span style="color: #006600;">vixiom</span>.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">RemotingMp3</span>
<span style="color: #0066CC;">extends</span> com.<span style="color: #006600;">vixiom</span>.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">Remoting</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// tracks holder object</span>
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> tracks:<span style="color: #0066CC;">Object</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">////////////////////////////////////////////////////////////////</span>
    <span style="color: #808080; font-style: italic;">//</span>
    <span style="color: #808080; font-style: italic;">// Constructor (gatewayURL, servicePath, userid, password)</span>
    <span style="color: #808080; font-style: italic;">//</span>
    <span style="color: #808080; font-style: italic;">////////////////////////////////////////////////////////////////</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> RemotingMp3 <span style="color: #66cc66;">&#40;</span>gURL, sp, u, p<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span>gURL, sp<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">// this.svc.connection.setCredentials(u, p);</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">////////////////////////////////////////////////////////////////</span>
    <span style="color: #808080; font-style: italic;">//</span>
    <span style="color: #808080; font-style: italic;">// Get tracks with handler (onGetTracks)</span>
    <span style="color: #808080; font-style: italic;">//</span>
    <span style="color: #808080; font-style: italic;">////////////////////////////////////////////////////////////////</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getTracks<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;// getting tracks&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #808080; font-style: italic;">// create a pending call out to rails</span>
        <span style="color: #000000; font-weight: bold;">var</span> pc:PendingCall = <span style="color: #0066CC;">this</span>.<span style="color: #006600;">svc</span>.<span style="color: #006600;">getTracks</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">// create a responder to handle the return from rails</span>
        pc.<span style="color: #006600;">responder</span> = <span style="color: #000000; font-weight: bold;">new</span> RelayResponder<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>,
        <span style="color: #ff0000;">&quot;onGetTracks&quot;</span>,
        <span style="color: #ff0000;">&quot;handleRemotingError&quot;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> onGetTracks <span style="color: #66cc66;">&#40;</span>re:ResultEvent<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>re != <span style="color: #0066CC;">undefined</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#123;</span>
            <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;// onGetTracks broadcaster - Word!&quot;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #808080; font-style: italic;">// put result in recordset</span>
            tracks = re.<span style="color: #006600;">result</span>;
            <span style="color: #808080; font-style: italic;">// trace for testing</span>
            <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i = <span style="color: #cc66cc;">0</span>; i &amp;lt; tracks.<span style="color: #0066CC;">length</span>; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>tracks<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">title</span><span style="color: #66cc66;">&#41;</span>;
            <span style="color: #66cc66;">&#125;</span>
            <span style="color: #808080; font-style: italic;">// dispatch event to the view</span>
            dispatch<span style="color: #66cc66;">&#40;</span>tracks, <span style="color: #ff0000;">&quot;onGetTracks&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
</blockquote>
<p>下面是controller的代码，需要注意的是，‘Rmp3’是我扩展的Remoting class的实例。它有两个参数，一个是WebORB geteway url，一个是在app/services中的'TrackService'类。我还没有展示扩展的view class，controller里已经产生了一个‘Vmp3’实例，<u>with the _root of the Flash file as it's parameter (it uses that as a target). </u>。下面四行是view中的按钮方法，最后一行调用远程方法，这是这个app的entry point<u>(as it's pretty useless sans data)</u>。</p>
<blockquote>
<pre class="actionscript">&nbsp;
<span style="color: #808080; font-style: italic;">// import remoting, view, and debug</span>
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">debug</span>.<span style="color: #006600;">NetDebug</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Delegate</span>;
<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">vixiom</span>.<span style="color: #006600;">remoting</span>.<span style="color: #006600;">RemotingMp3</span>;
<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">vixiom</span>.<span style="color: #006600;">view</span>.<span style="color: #006600;">ViewMp3</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// ini debug</span>
NetDebug.<span style="color: #006600;">initialize</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
iniApp<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// setup and start</span>
<span style="color: #000000; font-weight: bold;">function</span> iniApp<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// create remoting &amp;amp; view objects</span>
    <span style="color: #000000; font-weight: bold;">var</span> Rmp3:RemotingMp3    = <span style="color: #000000; font-weight: bold;">new</span> RemotingMp3 <span style="color: #66cc66;">&#40;</span>
    <span style="color: #ff0000;">&quot;http://localhost:3000/weborb&quot;</span>,
    <span style="color: #ff0000;">&quot;TrackService&quot;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// weborb gateway, ruby class name</span>
    <span style="color: #000000; font-weight: bold;">var</span> Vmp3:ViewMp3        = <span style="color: #000000; font-weight: bold;">new</span> ViewMp3 <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">_root</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">// set up listeners</span>
    Rmp3.<span style="color: #006600;">addEventListener</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;onGetTracks&quot;</span>,
    Delegate.<span style="color: #006600;">create</span> <span style="color: #66cc66;">&#40;</span>Vmp3, Vmp3.<span style="color: #006600;">onGetTracks</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    pause_btn.<span style="color: #0066CC;">onRelease</span> = Delegate.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span>Vmp3, Vmp3.<span style="color: #006600;">pauseTrack</span><span style="color: #66cc66;">&#41;</span>;
    play_btn.<span style="color: #0066CC;">onRelease</span>  = Delegate.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span>Vmp3, Vmp3.<span style="color: #006600;">playTrack</span><span style="color: #66cc66;">&#41;</span>;
    prev_btn.<span style="color: #0066CC;">onRelease</span>  = Delegate.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span>Vmp3, Vmp3.<span style="color: #006600;">previousTrack</span><span style="color: #66cc66;">&#41;</span>;
    next_btn.<span style="color: #0066CC;">onRelease</span>  = Delegate.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span>Vmp3, Vmp3.<span style="color: #006600;">nextTrack</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">// start the app, get the tracks</span>
    Rmp3.<span style="color: #006600;">getTracks</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre>
</blockquote>
<p>下面是扩展的view，相当复杂，而且和rails及Remoting没什么关系，所以看一下它的注释，就能明白它的意思了。里克：我就不贴了，看类名就知道它在哪了。</p>
<blockquote>
<pre class="actionscript">&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> com.<span style="color: #006600;">vixiom</span>.<span style="color: #006600;">view</span>.<span style="color: #006600;">ViewMp3</span> <span style="color: #0066CC;">extends</span> com.<span style="color: #006600;">vixiom</span>.<span style="color: #006600;">view</span>.<span style="color: #006600;">View</span></pre>
</blockquote>
<p>就是这样了，不过要注意一下<a href="http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_14213">跨域安全问题</a>，尤其是当你的rails应用在一台服务器上，而Flash文件在另一台服务器上的时候。</p>
<p>里克，07年10月23日，Railser.cn</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/flash-remoting-for-rails-tutorial-chinese/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

