wysiwyg gem的“html_safe”方法不起作用

时间:2016-04-27 07:42:42

标签: html ruby-on-rails froala

我正在写博客,作为表格,我使用wysiwyg froala editor的宝石。我也缩短了索引页面上的帖子内容,我使用了truncate方法。问题是.html_safe方法(应该将编辑表单中的内容显示为html代码但不显示为纯文本)在与truncate方法的连接中不起作用。所以,这是代码:

index.html.erb

<% @posts.each do |post| %>
    <h3 class="title">
        <%= post.title %>
        <small class="date">
            | <%= post.created_at.strftime('%B, %d, %Y') %>
        </small>
   </h3>
   <p class="fr-view">
       <%= truncate(post.content, length: 100).html_safe %>...
       <%= link_to ' Read more', post %>
   </p>
<% end %>

_form.html.erb

<%= form_for @post, role:"form" do |f| %>
    <p>
        <%= f.label :title %><br>
        <%= f.text_field :title %>
    </p>
    <div class="form-group">
        <%= f.label :content %><br>
        <%= f.text_area :content, id:"edit", rows:"3", class:"form-control" %>
    </div>
    <p>
        <%= f.submit 'Create', class:'btn btn-primary' %>
    </p>
<% end %>
<script>
  $(function() {
    $('#edit').froalaEditor()
  });
</script>

这是在控制台中为post.content返回的内容:

Post.find(1)
     <Post id: 1, title: "Lorem Ipsum", content: "<p>Lorem ipsum dolor sit amet, consectetur adipisc..."

1 个答案:

答案 0 :(得分:1)

问题是你已经颠倒了订单。 html_safe将字符串标记为受信任,但如果您对其执行其他操作,则不再信任该字符串。这应该有效:

<p class="fr-view">
    <%= truncate(post.content, length: 100).html_safe %>
</p>

更新:在评论中讨论了这个问题之后,我认为问题在于,如果您截断,某些代码可能会保持打开状态,这可能会在您的网页中产生各种问题(不一定限于字符串的内容)。有两种选择:

  1. 不要截断字符串,而是用CSS限制显示的部分;在这种情况下,您仍将拥有有效的HTML代码,该代码应在浏览器中正确呈现;
  2. 在截断之前删除所有HTML标记,如下所示:truncate strip_tags(post.content), length: 100。这也会更加安全,因为您的用户可能会插入恶意代码。
  3. 作为一般说明,在rails中使用sanitize代替html_safe是一种很好的做法,以降低向用户输入的恶意代码发送到浏览器的风险。