2016-04-13 4 views
1

を働いていない私は最近、ストリーミングレールを発見し、様々なドキュメントを読んだ、私はそうのような私のコントローラのいずれかにそれを追加しようとしました:Railsのストリーミング:「ストリームをレンダリング:真の」

def index 
    render :stream => true 
end 

マイテンプレートファイル

<%10.times do%> 
    <p> 
    I should get streamed ERB... 
    <%sleep 0.5%> 
    </p> 
<%end%> 

0.5秒ごとにメッセージを表示するのではなく、5秒間待ってページ全体を表示します。私はブラウザでこの動作をチェックし、カールを使用しています。

私はOSX上でユニコーンを使用しています、はい、私はストリーミング用unicorn.rbに構成:

listen 3000, :tcp_nodelay => true, :tcp_nopush => false 
worker_processes 1 

あなたは私のレイアウトファイルを見たい場合は、それは次のようになります。

<!DOCTYPE html> 
<html> 
<head> 
    <title>StreamingTest</title> 
    <%= stylesheet_link_tag "application" %> 
    <%= javascript_include_tag "application" %> 
    <%= csrf_meta_tags %> 
</head> 
<body> 

<%= yield %> 

</body> 
</html> 

私はすべての宝石類(レールとポストグルを除く)を無効にしようとしましたが、コントローラ、レイアウト、テンプレートを無駄なく最小限に抑えました。

私は見つけた完全なストリーミングデモ(https://github.com/slim-template/slim-streamingtest)をダウンロードしていましたが、それを実行したときにもストリーミングしませんでした。 (デモを実行しようとしている人に注意してください:httpdの代わりにhttpsを使用するようにgemfileソースを変更してから、 "bundle install"を実行する前に "update sprockets"をバンドルする必要がありました)

I

Rails Streaming not Streaming

また、彼らのために動作します私の作品何でもそのことがあります(プーマを使用して)他の誰かが正常に解決されていない同様の問題を、持っているように見えることに注意してください。

ストリーミングは本当に私たちのアプリを助けてくれるでしょうが、私もそれを得ることができますが、私も得ることができませんデモストリーミングアプリが正しく動作するように!私はそれが私の開発環境と関係があるかもしれないと思うが、私はHerokuに私のアプリを配備するときに問題が残っている。どんな助けでも大歓迎です。 。 。

ありがとうございます!

+0

私はこれまでプレイしたことがありません。しかし、一度それを理解し、アクションケーブルでそれを構築しようとする。 – 7urkm3n

+0

あなたはどのバージョンのRailsを使用していますか? –

+0

Rails 4.1.8、ruby 2.1.2 – dacoinminster

答えて

1

あなたが言及したデモレポを試しましたが、その動作は予想どおりです。この例では、テンプレートのストリーミングを停止してから、5秒後にレンダリングが完了するまで待って残りの部分を送信します。カールを使用する場合:

# curl -i http://localhost:3000 

HTTP/1.1 200 OK 
Date: Thu, 21 Apr 2016 17:29:00 GMT 
Connection: close 
Cache-Control: no-cache 
Transfer-Encoding: chunked 
Content-Type: text/html; charset=utf-8 
X-UA-Compatible: IE=Edge 
X-Runtime: 0.018132 

<!DOCTYPE html> 
<html> 
    <head> 
    <title>StreamingTest</title> 
    <link href="/stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" /> 
    <script src="/javascripts/application.js" type="text/javascript"></script> 
    <meta content="authenticity_token" name="csrf-param" /> 

次に、テンプレートがレンダリングを終了するのを待ってから送信します。

... 
    <p> 
    I should get streamed... 
    </p> 
</body></html> 

これは起こりそうなことです。 0.5秒ごとに部分の一​​部を送信しません。

テンプレートを使用したスト​​リーミングの主な目的は、ブラウザがコンテンツの残りの部分よりも前にヘッダーを受信して​​、アセットの読み込みに時間を節約できるようにすることです。記載の通りin the docs

ストリーミングは、レイアウトを最初にレンダリングし、レイアウトの各部分を処理する際にストリーミングすることによって、レンダリングフローを反転します。これにより、通常はレイアウト内にあるHTMLのヘッダーをクライアントにすばやく戻すことができ、JavaScriptやスタイルシートを通常より早く読み込むことができます。

完全にレンダリングされていない限り、部分を送信しません。

body 
    = yield 
    = render 'application/other' 

そして、次の内容

_other.html.erbという名前の部分を作成します:あなたはこのような application.html.slimレイアウトのボディを変更することができ期待している行動の種類を取得する方法をお見せすることが

<% sleep 1 %> 
<p>Me too!</p> 

これで、レイアウトの開始点をレンダリングし、レンダリングがindex.html.erbで終了するのを待って、それを送信し、カールで表示してからを待ちます部分的にレンダリングされて、要求本文を終了します。 Voilà。

ます。また、直接あなたが次の操作を行うことができ、コンテンツごとに数ミリ秒を送信するために、リクエストボディを養うことができます:あなたはできるが、これはしかしrender_to_stringを使用して、HTMLを送信するものではありません

def index 
    headers['Cache-Control'] = 'no-cache' 
    self.response_body = Enumerator.new do |yielder| 
    10.times do 
     yielder << "I should be streamed...\n" 
     sleep 0.3 
    end 
    end 
end 

が、あなたのコードでかなりの変更を加える必要があります。

これはすべてRails 3.xであり、4.xではActionController::Liveを使用する必要があることに注意してください。 ActionController::Liveの場合、クライアント側をレンダリングするためにjsでイベントを送信したサーバーをリッスンする方法の例があります(mini-chat)。

+0

@ marc-lainezにお返事いただきありがとうございます!私は、私が付いた恩恵を受けても、決して答えを得られないと思っていました! – dacoinminster

+0

私は、「レンダリング:ストリーム=> true」を使用して私のページがタイムアウトしないようにすることを望んでいました(私はHerokuを使用していますが、タイムアウトを増やすことはできません。ビルド)、しかし、ページはまだストリーミングでタイムアウトしました。それは期待される行動のように聞こえる?私はこの問題を回避するために、ページをより高速に読み込むように最適化したので、私が始めたときほどひどく答えは必要ありませんでしたが、実際に助けに時間を費やしてから奨励金を授与しています! – dacoinminster

+0

私はあなたが終わることのある状況を理解し、それを解決するためにストリームまたはサーバー送信のイベントを使用することをお勧めしますが、個人的には正しいアプローチではないと思います。あなたが記述しているのは、データを取得して大きな部分をレンダリングするときのパフォーマンス上の問題のようです。最初のステップは、データベースクエリを極限まで最適化し、キャッシュを使用することです。もう1つのアプローチは、AJAXリクエストで通常のテンプレートレンダリングではなくそのコンテンツの一部を取得することです。これらのトピックについて別の質問を投稿した場合は、お手伝いします。ベスト。 –

関連する問題