2017-05-24 23 views
2

我正在处理我的第一个Rails网站,但我遇到了一个小问题:我想将< br />标记显示为行休息,但我也想显示其他标签为字符串。HTML和Ruby on 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>

我知道作为换行符这样我可以显示< BR />标记:

<%= simple_format @user_input %>

但问题是这个命令显示:

Go to #2
Go to #3

而不是:

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

预先感谢您!

回答

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 %> 

UPDATE

有些情况下会失败,并在上面的方法,例如:

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

为了能够处理这些情况下,您可以使用引入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文档,并与"\n"替换所有br标签。

二,创建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/>"> 

您可能需要进一步加强这方面的代码更边缘情况,但我认为这个例子将做的伎俩。

也可以考虑使用帮手而不是将所有的代码放在你的控制器/视图中。

+0

您不能依赖正则表达式或使用'
'作为分隔符。如果字符序列“
”实际上不是一个HTML标记,例如'”>',那么这将失败。 – meagar

+0

@meagar是的,你说得对,对于边缘情况,解析HTML并从那里开始工作会更好。 _Nokogiri_可能会很方便,因为它已经包含在rails中。我将发布更新以涵盖该场景。 – Gerry

+0

@ AHWD777检查边缘病例的更新答案。 – Gerry

4

使用Rails清理帮助程序方法并将您想要允许的标记列入白名单,并将那些您不需要的标记留下。所有遗漏的内容将被剥离并显示为文本。因此,在你的情况下,它会是这样

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

有关的sanitize方法API资讯见http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-sanitize

+0

它在换行符中更改
标记,但其他HTML标记不显示在屏幕上... – AHWD777

+0

是的,sanitize方法转义html,除了列入白名单的标记之外根本没有显示它。没有一个Rails助手可以转义并仅显示一些html标记并呈现其他标记。你必须为此做一些Ruby技巧。 Gerry的回答如下,只是尝试了一下。 –

相关问题