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を使用して、明示的に値を渡す必要があります。