【发布时间】:2017-05-24 00:37:51
【问题描述】:
我正在开发我的第一个 Rails 网站,但有一个小问题:我想将
标签显示为换行符,但我也想将其他标签显示为字符串。
例如,用户输入是:
转到#2
转到#3
我要显示:
转到#2
转到#3
我知道我可以像这样将
标签显示为换行符:
但问题是这个命令显示:
转到#2
转到#3
而不是:
转到#2
转到#3
提前谢谢你!
【问题讨论】:
标签: html ruby-on-rails ruby line-breaks
我正在开发我的第一个 Rails 网站,但有一个小问题:我想将
标签显示为换行符,但我也想将其他标签显示为字符串。
例如,用户输入是:
转到#2
转到#3
我要显示:
转到#2
转到#3
我知道我可以像这样将
标签显示为换行符:
但问题是这个命令显示:
转到#2
转到#3
而不是:
转到#2
转到#3
提前谢谢你!
【问题讨论】:
标签: html ruby-on-rails ruby line-breaks
使用 Rails sanitize helper 方法,将您希望允许的标签列入白名单,将不允许的标签排除在外。所有遗漏的内容都将被剥离并显示为文本。所以在你的情况下,它会像
<%= sanitize @user_input, tags: %w(br) %>
有关清理方法 api 信息,请参阅http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-sanitize。
【讨论】:
你可以这样做:
<% @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="<br/>">
是的,有一个小警告,因为原来的value='<br>' 变成了value="&lt;br/&gt;",但我希望这不是一个大问题;但如果是,那么你可以这样做:
<%= @input.css('body').children.to_s.gsub("<", "<").gsub(">", ">") %>
还有输出:
<a href="#2">Go to #2</a>
<a href="#3">Go to #3</a>
<input type="text" value="<br/>">
您可能需要进一步增强此代码以应对更多边缘情况,但我认为此示例可以解决问题。
还可以考虑使用 helper 而不是将所有代码都扔到控制器/视图中。
【讨论】:
<br/> 作为分隔符。如果字符序列 <br/> 实际上不是 HTML 标记(例如 <input type="text" value="<br/>">),则会失败。