Тонкое различие в том, как HAML обрабатывает метод рендеринга с блоком в шаблонах Rails - PullRequest
1 голос
/ 07 июля 2011

Я наткнулся на несоответствие в том, как 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 ...

1 Ответ

2 голосов
/ 14 июля 2011

Да, у меня та же проблема. Это также описано в https://github.com/nex3/haml/issues/412
В github аккаунте nex3 есть ветка Issue_412, но она не завершена. Вы могли бы попытаться исправить хамл, я решил вернуться к рельсам 3.0.7.

...