2015-01-03 2 views
1

Я пытаюсь произвести следующий HTML, используя рельсы хелперы в хелперов файле:рендеринга текста и HTML в блоке content_tag

<span class="btn btn-default btn-file"> 
    Browse File<%= file_field_tag :file %> 
</span> 
<input type="text" class="form-control file-display" placeholder="" style="width: 250px; display: inline"> 

Это то, что я пробовал:

def file_helper(form, attr) 
    span = content_tag :span, class:"btn btn-default btn-file" do 
    "Browse File" + form.file_field(attr) 
    end 
    input = content_tag(:input, nil, type: 'text', class:"form-control file-display", style:"width: 250px; display: inline") 
    span + input 
end 

<%= file_helper f, :document %> 

К сожалению, в результате HTML выглядит следующим образом:

<span class="btn btn-default btn-file">Browse File&lt;input id="document_document" name="document[document]" type="file" /&gt;</span> 
<input class="form-control file-display" style="width: 250px; display: inline" type="text"> 

проблема заключается в вложенной вход диапазона не отображаются как HTML. Он отображается как текст вместе с «Browse File». Как я могу получить «Обзорный файл» для рендеринга в виде текста и ввода для рендеринга как html во внешнем пространстве?

ответ

1

Вы бежите в вопрос, когда объединение «безопасные» Строки, которые обернут SafeBuffer и небезопасных строк, которые не являются.

SafeBuffer наследует от String, перекрывая +, CONCAT и < < так, что:

  • Если другая строка безопасна (другой SafeBuffer), буфер присоединяет его непосредственно
  • Если другой строки небезопасен (обычный String), буфер сбегает его первым, а затем присоединяет его

(источник: click)

В вашем случае form.file_field(attr) дает правильный безопасный буфер, но «Browse File» - нет. В результате, когда они объединены, они теперь являются регулярной строкой, не обернутой SafeBuffer.

В последней строке вы снова объединяете правильно обернутую строку input с предыдущей развернутой строкой span, которая приводит к экранированию span.

.html_safe создает оболочку SafeBuffer для строки, поэтому обертка "Browse File".html_safe + form.file_field(attr) должна делать трюк.

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