Я наткнулся на несоответствие в том, как HAML обрабатывает метод render
в Rails.
Пример 1 в ERB :
# template.html.erb
This is the index template.
<%= render :layout => 'form4', :partial => 'stuff2' %>
# _layout.html.erb
<%= form_tag do %>
<div class="something">
<%= yield %>
</div>
<% end %>
# _partial.html.erb
<b>meh</b>
<%= text_field_tag 'name' %>
Пример 1 в HAML :
# template.html.haml
This is the index template.
=render :layout => 'form2', :partial => 'stuff1'
# _layout.html.haml
=form_tag do
.something
=yield
# _partial.html.haml
%b meh
=text_field_tag 'name'
Как и ожидалось, оба результата дают одинаковый рендеринг (сокращенно ниже):
This is the index template.
<form>
<div class="something">
<b>meh</b>
<input id="name" name="name" type="text" />
</div>
</form>
Теперь, здесь , где начинается странность. Когда я настраиваю оператор render
, чтобы использовать синтаксис блока, как показано ниже:
In ERB :
# template.html.erb
This is the index template.
<%= render :layout => 'form3' do %>
<b>meh</b>
<%= text_field_tag 'name' %>
<% end %>
# _layout.html.erb
<%= form_tag do %>
<div class="something">
<%= yield %>
</div>
<% end %>
In HAML :
# template.html.haml
This is the index template.
=render :layout => 'form1' do
%b meh
=text_field_tag 'name'
# _layout.html.haml
=form_tag do
.something
=yield
Я получаю то же самое выше рендеринга в версии ERB, но код HAML выводит:
This is the index template.
<b>meh</b>
<input id="name" name="name" type="text" />
<form>
<div class='something'></div>
</form>
Как будто HAML как-то не уважает блок, который был передан ему. Согласно документам HAML, они поддерживают блоки, которые автоматически закрываются на основе отступов, поэтому я не подозреваю, что это проблема. Кроме того, в их документах я видел определение собственного метода render
. Возможно ли, что он не реализован должным образом, чтобы сопровождать тот же интерфейс, что и метод rails (erb?) render
?
На этом замечании, если это действительно несоответствие в интерфейсе методов, оправдывает ли это открытие проблемы с HAML?
Только что добавили пример приложения, показывающего поведение на https://github.com/iamvery/haml-weirdness
Стоит также отметить, что я заметил это изменение, когда обновил приложение rails до 3.0.9 и haml до 3.1.2. Оставление хамла на 3.0.24 привело к ошибке Cannot modify SafeBuffer in place
в рельсах 3.0.9 ...