2012-01-14: content_for_in_controllers を gem にしてくれた人がいます。 thanks!
Rails 3.1 では HTTP Streaming が導入されますが、 stream ON だと template と layout の処理順序がいままでの rails のように template -> layout ではなく layout 前半 -> template -> layout 後半 という自然な流れになるのですが、 content_for が絡むとややこしいことになります (詳しくは action_controller/metal/streaming.rb のコメントを参照)。この関係で、 layout 前半で content_for :bar が先に実行されていることを期待した yield :bar が空振りしないように、 layout 前半で yield :bar などが実行されると stream であるのにも係わらず template が先に実行されます。このジレンマを緩和するために provide というヘルパーが導入されて、 provide :bar されると、以降の template の処理を中断して layout 前半を処理しているようです。
もうこうなると stream ON のときは content_for は使わないで、 controller で
@title = "foo"
とかやってしまいそうになるので、 content_for を controller でも実行できるようにしてみました。 rails 2.X, 3.0 で使っていたやっつけ実装なのですがいちおう rails 3.1 でも動くことは確認しました。みたいな感じで使います。
あと HTTP Streaming に関しては、
いままでは view のベンチマーク結果に DB の負荷が混ざらないためにも DB アクセスは action 内で実行されるようにしてたけど stream の場合 view のレンダリング中に DB アクセスが実行されるようにしたほうがよいことになりますね。(ソースのコメントにもかいてありますけど。)
また、HTTP Streaming は ruby 1.9 の Fiber が使われているので、 Encoding の問題が煩わしくて ruby 1.9 にする必要性が感じられない場合に ruby 1.9 導入のきっかけになるといいですね。
No comments:
Post a Comment