RubyonRails3:通过Rails将数据流传输到客户端

我正在开发一个RubyonRails应用程序,它可以与RackspaceCloudFiles进行通信(类似于AmazonS3,但缺少一些功能)

由于缺乏每对象访问权限和查询字符串身份验证,用户的下载必须通过应用程序进行调解

在Rails 2.3中,您可以动态构建响应,如下所示:

#将大约180 MB生成的数据流到浏览器。
呈现:文本=>过程{响应,输出|
十倍于我|
write(“这是第#{i}\n行”)
终止
}

(来自http://api.rubyonrails.org/classes/ActionController/Base.html#M000464)

我可以将我的cloudfiles流生成代码转储到那里,而不是10\u 000\u 000.times…

问题是,这是我在Rails 3中尝试使用此技术时得到的输出

#<程序:[email protected]/Users/jderiksen/lt/lt uber/site/app/controllers/prospect\u uploads\u controller.rb:75>

看起来可能没有调用proc对象的调用方法?还有其他想法吗

response_body分配一个对象,该对象响应#每个

类拖缆
定义每个
十倍于我|
产生“这是第#{i}\n行”
终止
终止
终止
self.response_body=拖缆.new

如果您使用的是1.9.x或Backports gem,则可以使用枚举器更简洁地编写它。新建

self.response_body=Enumerator.new do|y|
十倍于我|
y&lt&书信电报;“这是第#{i}\n行”
终止
终止

请注意,何时和是否刷新数据取决于所使用的机架处理程序和底层服务器。例如,我已经确认Mongrel将流式传输数据,但其他用户报告说,例如WEBrick会将数据缓冲到响应关闭为止。无法强制响应刷新

在Rails 3.0.x中,还有几个附加问题:

  • 在开发模式中,由于与类重新加载的不良交互,从枚举中访问模型类等操作可能会出现问题。这是Rails 3.0.x中的一个开放bug
  • 机架和导轨之间的交互中的一个错误导致每个请求调用两次#each。这是另一个开放的bug。您可以使用以下猴子补丁解决此问题:

    类机架::响应
    def关闭
    @body.close如果@body.response_to?(:close)
    终止
    终止
    

这两个问题在Rails 3.1中都得到了修复,其中HTTP流是一个选框特性

请注意,另一个常见的建议,self.response_body=proc{| response,output |…},在Rails 3.0.x中确实有效,但在3.1中已被弃用(并且不再实际传输数据)。分配一个响应#每个的对象在所有Rails 3版本中都有效

发表评论