【问题标题】:Ruby on Rails - print output to bufferRuby on Rails - 将输出打印到缓冲区
【发布时间】:2012-04-05 17:59:21
【问题描述】:

我有一个返回一个大 HTML 字符串的大方法。这是非常无效的,并且浏览器需要很长时间才能一次加载所有 HTML。我的问题是:Ruby on Rails 是否有办法将部分 HTML 打印到缓冲区,所以它不会一次全部完成?

这就是我的意思:

module TestHelper
    def my_method
        output = ""
        output += "<div>"
        output += "<span>Test</span>"
        output += "</div>"
        return output
    end
end

但我想知道我是否可以这样做:

module TestHelper
    def my_method
        print_to_page "<div>"
        print_to_page "<span>Test</span>"
        print_to_page "</div>"
    end
end

我的问题是不是关于如何以不同的方式或“正确”的方式来做,我这样做是有原因的。我在网上搜索并阅读了有关with_output_buffer 的信息,但我不知道它是如何工作的。有什么建议吗?

【问题讨论】:

  • 我没有充分的理由想出为什么增量输出一个字符串比一次性输出要好得多。也就是说,您应该使用&lt;&lt; 而不是+= 来构建字符串。 += creates a new object every time it's called while &lt;&lt; does not。该更改提高您的性能(可能显着取决于您的实际代码)。
  • 这似乎有很大的不同,因为我有一个 PHP 版本,它在运行时输出一个字符串(该函数多次调用自身),还有一个 Ruby 版本,它在最后返回一个字符串。我的做法也略有不同...我将字符串添加到数组中,然后加入数组。但我认为这不是问题,因为缓慢的部分是在客户端/浏览器端。
  • 我明白了,您关心“部分页面”(因为没有更好的术语)加载时间,其中至少显示了一些页面,而不是 最终 页面加载时间。您可能要考虑首先尝试优化慢速方法,如果用户在相同的持续时间内看不到所有内容,IMO 快速查看某些内容对用户来说并没有好多少——但这只是我的意见,我不知道您更广泛的用例。
  • 其实它比 PHP 版本慢得多。 PHP 在 5 秒内显示所有内容,而 Ruby 版本大约需要 60 秒才能显示。
  • 然后让你的方法更快!输出缓冲不会增加总加载时间。我已经给了你一个建议,分析页面并找出它加载如此缓慢的原因。

标签: ruby-on-rails ruby buffer helper


【解决方案1】:

更高版本的 rails 支持streaming,它可以有效地为您提供所需的内容。

但是!请注意,您所要求的就是您所需要的。使用firebug 的net 选项卡查看页面加载需要多长时间,以及时间花在了哪里。如果浏览器花费特别长时间等待获取任何页面数据,那么流式传输可能会对您有所帮助。但是,请记住,要使用流式处理,您的代码还必须能够以块的形式生成 HTML 页面。这可能比你想象的要难——比如

<%= table_tag { render_huge_table } %>

无法使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2014-03-11
    • 2015-05-17
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多