我想使用rails 4引入的实时流功能。在我的应用程序中它没有用,所以我只创建了一个非常简单的例子。但这也不会流式传输内容。它打开连接,等待所有10次运行都通过,然后流式传输竞争。
以下是示例代码。
控制器看起来像这样:
class MyController < ApplicationController
include ActionController::Live
def index
response.headers['Content-Type'] = 'text/event-stream'
10.times {
response.stream.write "This is a test Messagen"
sleep 1
}
response.stream.close
end
end
我用curl进行测试:
curl -i http://localhost:3000/my
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Content-Type: text/event-stream
Cache-Control: no-cache
Set-Cookie: request_method=GET; path=/
X-Request-Id: 7bdf30a2-158b-40ce-81c8-651914c7b5df
X-Runtime: 0.048783
Transfer-Encoding: chunked
This is a test MessagenThis is a test MessagenThis is a test MessagenThis is a test
MessagenThis is a test MessagenThis is a test MessagenThis is a test MessagenThis is a test
MessagenThis is a test MessagenThis is a test Messagen
但它会持续10秒,直到消息全部写在一起(不是每秒一次)。
我在互联网上的很多页面上找到了这个代码示例 - 但不知道出了什么问题。
任何想法?
答案 0 :(得分:0)
首先,我认为你需要一个换行符才能让它与curl一起流式传输。
response.stream.write "This is a test Messagen\n"
curl localhost:3000
This is a test Messagen
This is a test Messagen
This is a test Messagen
This is a test Messagen
This is a test Messagen
换行符(\ n)似乎允许流式传输以睡眠方式递增,而不是等待整个时间段,然后立即吐出结果。
要实际渲染到视图(使用EventSource),您需要设置
config.cache_classes = true
config.eager_load = true
这将有效&#34;确定&#34;对于一个hello world,但是对于一些可靠且可扩展的东西,当你最终从数据库中取出时,我会使用Redis而不是循环。