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