render_component_as_string()の罠。

ActionController::Components::InstanceMethods#render_component_as_string()のこと。(長いので以下rcas())
他のアクションをこれで呼んだのだけれど、application.rhtmlが適用されちゃったってのが事の発端。
レスポンスを埋め込むんだから当然レイアウトは適用されてほしくないわけで。

ActionController::Base#render()(以下r())は「:layout=>false」を受け取ってくれるのにrcas()は受け取ってくれない。
じゃぁどうするんだってググってみたら、呼び出される方のアクション内でr()を呼んでやればよいとのこと。試してみたら確かに適用されなくなった。(コードは読まなかったのかって突っ込みはひとまず勘弁を。)
・・・でここから。
r()を呼ぶのはいいが、アクション内でこれを呼んだ場合に、それ以降のインスタンス変数がビュー(ここではbar.rhtml)の中で使えなくなる。


具体的にはこういうこと。

class FooController < ApplicationController
def bar
@baz1 = 'one'   # ←コイツは使える。
render :layout=>false
@baz2 = 'two'   # ←コイツはダメ。
end
end

ということで、「render :layout=>false」はアクションから出る直前に書けばいいことが分かったのだが、そうするとreturnがあったりすると、そこにも書かなくちゃならんことに・・・。

class FooController < ApplicationController
def bar
if Time.now.hour < 12
@hoge = 'AM'
render :layout=>false
return
end

render :layout=>false
@hoge = 'PM'
end
end

でもこれって気持ち悪いなぁ・・・とここまで書いて気がついた。

class FooController < ApplicationController
def bar
bar_inner
render :layout=>false
end

private
def bar_inner
if Time.now.hour < 12
@hoge = 'AM'
return
end

@hoge = 'PM'
end
end

これでいいのか。でもなんかなぁ・・・。
というか、世のRubyistは(ry

タイトルとURLをコピーしました