render :partialの使い方。

以前のエントリー、「いつの間にやらrender(:partial)の仕様が変わってた...」で書いていたんだけど。


これまでは、:partialで指定したテンプレート名で、同名のインスタンス変数を渡すことが出来たのが、出来なくなりました(まあ、やらないようにしましょうね、程度なんだろうけど)。


さて。
どうするべ?


いや、悩んだねー。
渡すべき変数が、単体オブジェクトならいいんだけど、オブジェクトの配列の場合、どうすんのよ?
:collectionで指定したら、その配列の回数、テンプレートが回されるだけで、例えば、テンプレートの中で見出しを付けて、その後ろでループを回したい時とか。
render :partialの外で書いちゃったら、DRYじゃないじゃない?
ねえ?


で。
出した結論が。
「じゃあ、そのコレクションをローカル変数で渡せばいいじゃん」でしたwww


ええーーーーっ!?
って感じだよね?www


いやあ、思い込みって、怖いよねぇ...
なんで、それをしちゃあいけないって思い込んでたんだろうwww
つうか、なんで、渡すオブジェクトなりコレクションなりのそのものを、ローカル変数で明示的に渡す、という風には解釈出来なかったんだろうwww


だから、

render :partialを使用する場合の暗黙のローカル変数割り当ては非推奨です。
>>|ruby|
def partial_with_implicit_local_assignment
@customer = Customer.new("Marcel")
render :partial => "customer"
end
|

以前は上記のコードで、partial内におけるローカル変数customerが使用できました。 現在は、:localsを使用して、明示的に値を渡す必要があります。