gpt4 book ai didi

ruby-on-rails - Ruby on Rails 3 : Streaming data through Rails to client

转载 作者:行者123 更新时间:2023-12-01 21:47:17 25 4
gpt4 key购买 nike

我正在开发一个 Ruby on Rails 应用程序,该应用程序与 RackSpace 云文件进行通信(类似于 Amazon S3,但缺少一些功能)。

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

在 Rails 2.3 中,您似乎可以按如下方式动态构建响应:

# Streams about 180 MB of generated data to the browser.
render :text => proc { |response, output|
10_000_000.times do |i|
output.write("This is line #{i}\n")
end
}

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

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

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

#<Proc:0x000000010989a6e8@/Users/jderiksen/lt/lt-uber/site/app/controllers/prospect_uploads_controller.rb:75>

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

最佳答案

分配给response_body一个响应#each的对象:

class Streamer
def each
10_000_000.times do |i|
yield "This is line #{i}\n"
end
end
end

self.response_body = Streamer.new

如果您使用的是 1.9.x 或 Backports gem,您可以使用 Enumerator.new 更紧凑地编写它:

self.response_body = Enumerator.new do |y|
10_000_000.times do |i|
y << "This is line #{i}\n"
end
end

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

在 Rails 3.0.x 中,还有几个额外的问题:

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

    class Rack::Response
    def close
    @body.close if @body.respond_to?(:close)
    end
    end

这两个问题都在 Rails 3.1 中得到了解决,其中 HTTP 流是一项重要功能。

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

关于ruby-on-rails - Ruby on Rails 3 : Streaming data through Rails to client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3507594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com