TL;DR
_item.html.slim
h3 Item Name: #{item.name}
p Item Index: #{item_counter}
_wrapped_item.html.slim
h2 Item Wrapper
.item-area
= render partial: 'item',\
locals: { item: wrapped_item, item_counter: wrapped_item_counter }
index.html.slim
h1 Naked Items
.naked-items = render partial: 'item', collection: @items
h1 Wrapped Items
.wrapped-items = render partial: 'wrapped_item', collection: @items
はじめに
パーシャルをrenderする際、<%= render partial: 'item', collection: @items %>
を使うと、.each
文より見通しが良くなるだけでなく、性能も向上されるとされています。
しかし、パーシャルにそれぞれラッピングやデコレーションをしたい場合、どうすれば良いのでしょう。
発見
_item.html.slim
h3 Item Name: #{item.name}
p Item Index: #{item_counter}
_wrapped_item.html.slim
h2 Item Wrapper
.item-area = render partial: 'item'
index.html.slim
h1 Naked Items
.naked-items = render partial: 'item', collection: @items
h1 Wrapped Items
.wrapped-items = render partial: 'wrapped_item', collection: @items
上記の構文のように、そのまま_item.html.slim
にラッピングを当てて、renderingしようとする時、Template::Error
が発生し、変数item
がないと言われました。
ActionView::Template::Error (undefined local variable or method `item' for #<#<Class:0x00007f8d8fa105d0>:0x00007f8da6f657a8>:
1: h3 Item Name: #{item.name}
2: p Item Index: #{item_counter}
だったら変数item
を手動で渡せば良いのでは?と思って、変数wrapped_item
をitem
として渡しました。もちろん、Indexも必要な時は、#{variable_name}_count
も伝播しなければいけません。
_wrapped_item.html.slim
h2 Item Wrapper
.item-area
= render partial: 'item',\
locals: { item: wrapped_item, item_counter: wrapped_item_counter }
参考