使用 HAML 的 Rails HTTP 流式传输

Posted

技术标签:

【中文标题】使用 HAML 的 Rails HTTP 流式传输【英文标题】:Rails HTTP streaming with HAML 【发布时间】:2011-11-22 04:48:37 【问题描述】:

在 Rails 中将 HTTP 流与 HAML 项目一起使用似乎存在问题。如果我改用 ERB,它会完美运行。显然,this problem 的不止我一个。

stream 放在控制器顶部或在操作中使用render :stream => true 时不起作用。

我怎样才能让 HAML 和 HTTP 流很好​​地结合在一起?

更新:我在 gem 的页面上打开了一个问题,here。

【问题讨论】:

我想这是因为 HAML 必须先呈现整个页面,然后才能开始将任何内容发送给客户——这将是一个设计问题。我没有将此作为答案发布,因为我不确定,而且我现在没有时间检查。 @Romain:感谢您的意见。这也是我的怀疑,HAML 不会将单个文件转换为 ERB,而是实际上等待整个视图被组装然后提供 html。或类似的东西。这将是一个重大的交易破坏者,现在 3.1 已经发布并且流媒体可用。 您是否尝试查看 HAML 和/或 Rails 是否已经有关于此的错误报告?我想修复 HAML 并非不可能(前提是我们都对错误的假设是正确的)。 谷歌的想法。 github.com/nex3/haml/issues/436 如果您正在寻找 ERB 的替代方案来进行 http 流式传输,SLIM 模板开箱即用地支持它:rubydoc.info/gems/slim/frames#Streaming 【参考方案1】:

HAML (source) 尚不支持此功能:

HTTP 流是需要大量 对核心 Haml 引擎的一组修改。只是适中 即使在基本情况下也很难让它工作,但是当你考虑到 诸如吃空格的运算符之类的东西,它会得到更多 困难。

这不是我在理论上反对的事情,但也不是 考虑到困难,我优先考虑的事情 实现它。

【讨论】:

【参考方案2】:

Haml 的内部结构使得它确实在进行过程中写入缓冲区。然而,Rails 传统上为模板语言提供的“标准”API 是一个相当简单的进出调用。我不认为 Haml 目前确实有“流媒体支持”,但它只是一个 API 问题而不是其他任何东西。

我很好奇 Rails 是如何插入 ERB 来做到这一点的。

【讨论】:

github.com/rails/rails/blob/master/actionpack/lib/action_view/…

以上是关于使用 HAML 的 Rails HTTP 流式传输的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails 3.1 和 Unicorn 在 Heroku 上进行 HTTP 流式传输

Rails 3.1 http 流式传输——js 在头部还是底部?

在 Ruby on Rails 3.2+ 中流式传输部分视图

使用 rails、nginx 和 send_file 在 Chrome 中流式传输 mp4

如何让 Haml 与 Rails 一起工作?

通过 nginx 流式传输来自独角兽的 rails 生成的响应