当我调用truncate()方法时html_safe不起作用

时间:2018-08-15 21:15:16

标签: ruby-on-rails rss truncate html-safe

对于要建立的网站,我有一个简单的RSS提要。我想为帖子做一个阅读更多链接,并将输出限制为300个字符。我的代码如下:

<p id="notice"><%= notice %></p>


<h1 class="reviews">What They're Saying About Us</h1>
<br />
<h1 class="post-title"><%= image_tag("icons8-rss-40.png") %>RSS Feed</h1>

  <% @home_blogs.each do |p| %>
    <div class="blog-posts">
      <h3><%= p.name %></h3> | <%= p.created_at.to_date %>
      <br />
      <p id="blog_post_content">
        <% if p.entry.length > 200 %>
          <%= truncate(p.entry, length: 300).html_safe %>
          <%= link_to "...read more", p %>
        <% else %>
          <%= p.entry.html_safe %>
      </p>
      <% end %>
      <br />
      <%= image_tag("if__hashtag_2559811.png")%>Tag Cloud
      <div class="tag-cloud">
      </div>
    </div>
  <% end %>

<span class="pagination"><%= will_paginate @home_blogs %></span>
<br>

无论出于什么原因,即使我正在执行html_safe,我创建帖子时仍会包含html标签。有任何想法吗?谢谢

1 个答案:

答案 0 :(得分:1)

truncate自动将输出标记为html_safe,并且默认情况下也转义内容。这意味着您甚至有机会自己将链接标记为html_safe之前,您的链接可能已被转义。

您可以将escape: false选项传递给truncate,以使其跳过默认情况下的转义。

例如

<%= truncate(p.entry, length: 300, escape: false) %>

docs for truncate

  

结果被标记为HTML安全的,但默认情况下将其转义,除非:escape为false。如果文本包含HTML标记或实体,则应格外小心,因为截断可能会产生无效的HTML(例如不平衡或不完整的标记)。