Это потому, что работает ERB. Смотрите сгенерированный в erb источник ruby для ваших шаблонов (template.src
, ниже приведено предварительное подтверждение), для предыдущего шаблона:
_erbout = +''
_erbout.<< " ".freeze
body do
_erbout.<< "\n 2\n ".freeze # <<-- this is the line that produces extra output
end
_erbout.<< "\n".freeze
_erbout
и для последнего:
_erbout = +''
_erbout.<< " ".freeze
_erbout.<<(( body do
2 # <<- and this time it is just plain ruby code
end
).to_s)
_erbout.<< "\n".freeze
_erbout
обратите внимание на то, как блоки выводятся в один и тот же буфер при запуске.
На самом деле это нормально и широко используется, например, для приведенного ниже блока, который передается методу each
, который, как вы ожидаете, будет объединен с каждым прогоном:
<% @items.each do |item| %>
Item <%= item %>
<% end %>