2012-05-08 2 views
1

У меня есть haml like;Haml отображает элемент ввода как экранированный

= form_for @company, :html => {:multipart => true}, :url => update_user_company_path do |f| 
    .field 
    Title:#{f.text_field :name} 
    = f.fields_for :attachments do |builder| 
    - if builder.object.new_record? 
     .field 
     = builder.hidden_field :name, :value => 'logo' 
     = builder.file_field :file 
    - elsif builder.object.name.eql?('logo') && !builder.object.file.url.eql?('/files/original/missing.png') 
     .field 
     %span.thumbnail 
      = link_to "Delete", delete_company_attachment_path(@company, builder.object), :method => :delete, :class => "remove_image" 
      = image_tag builder.object.file.url, :style => "height:86px;width:125px" 
    = f.submit 'Ok' 

Хром отображает этот код по назначению, но в Firefox это похоже;

<form method="post" id="edit_company_29" enctype="multipart/form-data" class="edit_company" action="https://stackoverflow.com/users/25/company" accept-charset="UTF-8"><div style="margin:0;padding:0;display:inline"><input type="hidden" value="✓" name="utf8"><input type="hidden" value="put" name="_method"><input type="hidden" value="thisismytokenvalue=" name="authenticity_token"></div> 
    <div class="field"> 
    Title:<input type="text" value="sdgdfgghjh" size="30" name="company[name]" id="company_name"> 
    </div> 
    &lt;input id="company_attachments_attributes_0_id" name="company[attachments_attributes][0][id]" type="hidden" value="114" /&gt;&lt;input id="company_attachments_attributes_1_id" name="company[attachments_attributes][1][id]" type="hidden" value="115" /&gt;<div class="field"> 
    <input type="hidden" value="logo" name="company[attachments_attributes][2][name]" id="company_attachments_attributes_2_name"> 
    <input type="file" name="company[attachments_attributes][2][file]" id="company_attachments_attributes_2_file"> 
    </div> 
    <input type="submit" value="Ok" name="commit"> 
</form> 

Почему элемент сбежал. Если вы проверите haml, вы увидите, что я их не поместил.

  • Откуда взялось?
  • Почему это происходит?
+0

Возможно ли, что у вас есть что-то, что переопределяет формообразователь и не возвращает строки .html_safe? – Unixmonkey

+0

На самом деле я так не думаю. потому что мой первый взгляд в формате .erb. Затем я использую http://html2haml.heroku.com/ для преобразования моего .erb в .haml. –

ответ

0

Вы должны вернуть что-то иное, чем nil в fields_for блоке.

This issue has been fixed in Haml 4.0.4 by mattwildig, с помощью @lulalala. Вот объяснение проблемы:

Помощник #fields_for создает скрытое поле ввода для каждой записи, которую он добавляет к результату захвата блока. Обычно возвращаемое значение capture будет SafeBuffer, так что это не будет экранировано. Однако, если блок ничего не пишет в буфер, тогда Haml возвращает литерал пустой String от capture. Скрытый элемент ввода согласован с этой строкой, и когда он объединяется с остальными элементами, поскольку он добавляется к SafeBuffer, он получает escape-код.

4

Вау ... У меня была аналогичная проблема. Я предполагаю, что если вы передадите nil в поля form_builder_, то для hidden_input не будет возвращен html_safe. Для того, чтобы быстро исправить, добавить

-else 
    ="" 

после всего ELSIF блока

+0

Спасибо! Это помогло мне из рассола. – Dylan

+0

Я считаю, что это обходной путь. выпуск все еще открыт. https://github.com/haml/haml/issues/439 –

Смежные вопросы