在content_tag块中呈现文本和html

时间:2015-01-03 23:40:32

标签: ruby-on-rails

我正在尝试使用帮助文件中的rails帮助程序生成以下html:

<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。它与“浏览文件”一起呈现为文本。如何将“浏览文件”呈现为文本,将输入呈现为外部跨度中的html?

2 个答案:

答案 0 :(得分:1)

您在组合&#34; safe&#34;时遇到了问题。由SafeBuffer包裹的字符串和不安全的字符串,不是。

  

SafeBuffer继承自String,重写+,concat和&lt;&lt;这样:

     
      
  • 如果另一个String是安全的(另一个SafeBuffer),则缓冲区直接连接它
  •   
  • 如果另一个字符串不安全(普通字符串),缓冲区首先将其转义,然后连接它
  •   
     

(来源:click

在你的情况下form.file_field(attr)会产生一个合适的安全缓冲区,但是&#34;浏览文件&#34;才不是。因此,当它们组合在一起时,它们现在是一个常规字符串,而不是由SafeBuffer包装。

在最后一行中,您再次将正确包装的字符串input与之前展开的字符串span合并,这会导致span被转义。

.html_safe为String创建一个SafeBuffer包装器,因此包装"Browse File".html_safe + form.file_field(attr)应该可以解决问题。

答案 1 :(得分:0)

尝试(span + input).html_safe Check this out...