【问题标题】:HTML and Ruby on Rails - Display <br/> tags as line breaks, but other tags as stringsHTML 和 Ruby on Rails - 将 <br/> 标签显示为换行符,但其他标签显示为字符串
【发布时间】:2017-05-24 00:37:51
【问题描述】:

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

例如,用户输入是:

转到#2
转到#3

我要显示:

转到#2
转到#3

我知道我可以像这样将
标签显示为换行符:



但问题是这个命令显示:

转到#2
转到#3

而不是:

转到#2
转到#3

提前谢谢你!

【问题讨论】:

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


    【解决方案1】:

    使用 Rails sanitize helper 方法,将您希望允许的标签列入白名单,将不允许的标签排除在外。所有遗漏的内容都将被剥离并显示为文本。所以在你的情况下,它会像

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

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

    【讨论】:

    • 它改变了换行符中的
      标签,但其他 HTML 标签不显示在屏幕上...
    • 是的,sanitize 方法通过除了列入白名单的标签之外根本不显示它来转义 html。没有一个 Rails 助手可以转义并仅显示为原始的一些 html 标记并呈现其他标记。你必须为此做一些 Ruby 技巧。格里在下面的回答有效,刚刚尝试过。
    【解决方案2】:

    你可以这样做:

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

    输出:

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

    或者更好的是,使用正则表达式,这样您就可以拆分 &lt;br&gt;&lt;br/&gt;

    <% @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" 充当&lt;br&gt; 很重要。

    还有输出:

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

    是的,有一个小警告,因为原来的value='&lt;br&gt;' 变成了value="&amp;lt;br/&amp;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/>">
    

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

    还可以考虑使用 helper 而不是将所有代码都扔到控制器/视图中。

    【讨论】:

    • 您不能依赖正则表达式或使用&lt;br/&gt; 作为分隔符。如果字符序列 &lt;br/&gt; 实际上不是 HTML 标记(例如 &lt;input type="text" value="&lt;br/&gt;"&gt;),则会失败。
    • @meagar 是的,你是对的,对于边缘情况,最好解析 HTML 并从那里开始工作。 Nokogiri 可能很方便,因为它已经包含在 rails 中。我将发布更新以涵盖该场景。
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多