HTML和Ruby on Rails - 将标签显示为换行符,将其他标签显示为字符串

时间:2017-05-24 00:37:52

标签: html ruby-on-rails ruby line-breaks

我正在开发我的第一个Rails网站,但我有一点问题:我想显示< br />标记为换行符,但我也想将其他标记显示为字符串。

例如,用户输入为:

<a href='#2'>Go to #2</a><br/><a href='#3'>Go to #3</a>

我想要显示:

<a href='#2'>Go to #2</a>
<a href='#3'>Go to #3</a>

我知道我可以显示&lt; br /&gt;标记为如下所示的换行符:

<%= simple_format @user_input %>

但问题是这个命令显示:

Go to #2
Go to #3

而不是:

<a href='#2'>Go to #2</a>
<a href='#3'>Go to #3</a>

提前谢谢!

2 个答案:

答案 0 :(得分:4)

使用Rails sanitize帮助程序方法并将您要允许的标记列入白名单,并将这些标记保留在您不允许的范围内。遗漏的所有内容都将被删除并显示为文本。所以在你的情况下它会像

<%= sanitize @user_input, tags: %w(br) %>

有关消毒方法api信息,请参阅http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-sanitize

答案 1 :(得分:1)

你可以这样做:

<% @user_input.split("<br/>").each do |line| %>
  <%= line %><br/>
<% end %>

输出:

<a href='#2'>Go to #2</a>
<a href='#3'>Go to #3</a>

甚至更好,使用正则表达式,以便您可以分割<br><br/>

<% @user_input.split(/<br\/>|<br>/).each do |line| %>
  <%= line %><br/>
<% end %>

<强>更新

有些情况会因上述方法而失败,例如:

<input type="text" value="<br/>">

为了能够处理这些情况,您可以使用已经捆绑了rails的 Nokogiri ,但是您需要在代码中添加几个额外的步骤。

首先,你的控制器:

def some_action
  input = "<a href='#2'>Go to #2</a><br/><a href='#3'>Go to #3</a><br><input type='text' value='<br/>'>"

  @user_input = Nokogiri::HTML.parse(input)
  @user_input.search('br').each { |br| br.replace("\n") }
end

基本上,您将创建一个Nokogiri HTML文档,并将所有br标记替换为"\n"

其次,创建一个css类,将这些"\n"用作断行:

.new-lines {
  white-space: pre-line
}

现在您只需将其添加到您的视图中:

<div class="new-lines">
  <%= @user_input.css('body').children %>
<div>

请注意使用class="new-lines",这对于使每个"\n"充当<br>非常重要。

输出:

<a href="#2">Go to #2</a>
<a href="#3">Go to #3</a>
<input type="text" value="&lt;br/&gt;">

是的,有一个小的警告,因为原value='<br>'变成了value="&lt;br/&gt;",但我希望这不是一个大问题;但如果是,那么你可以这样做:

<%= @input.css('body').children.to_s.gsub("&lt;", "<").gsub("&gt;", ">") %>

输出:

<a href="#2">Go to #2</a>
<a href="#3">Go to #3</a>
<input type="text" value="<br/>">

您可能需要进一步增强此代码以获得更多边缘情况,但我认为这个示例可以解决问题。

还可以考虑使用帮助,而不是将所有代码都放在控制器/视图中。