在Rails视图中截断+清理

问题描述 投票:8回答:3

今天我遇到了一个小问题,当时我试图使用sanitize并截断它们来为我的博客创建一个摘录。每个方法本身都有效,但是一起使用它只会截断。我尝试了这两种语法(前者在一篇名为“Six Ruby on Rails Tips&Tricks”的博文中被推荐):

<%= truncate(sanitize(post.content), length: 580) %>
<%= sanitize(truncate(post.content, length: 580, separator: '<p>')) %>

然后我尝试将truncate放在控制器中,并在视图中清理该对象,但仍然没有。

最后我让它像这样工作:

<%= sanitize(post.content.truncate(580, separator: '</p>')) %>

我想知道的是,当我用另一种方法包装方法时,为什么它不起作用?我尝试过的最后一种方式有什么不同?

TIA'bondibox'

ruby-on-rails truncate sanitize
3个回答
0
投票

Truncate和Sanitize不包含在控制器中,它们分别是ActionView::Helpers::TextHelperActionView::Helpers::SanitizeHelper的一部分。默认情况下,这些模块不包含在控制器中,因此您无法在其中使用它们。

但是,两者都包含在视图(模板)中,因此您可以在其中使用它们。您可以在控制器类中包含上述模块以在那里使用它们,但我不推荐它。

第二个语句起作用的原因是因为Rails从Ruby扩展了一些基础对象,比如String和几个methods。所以你实际上在一个由String方法截断的字符串的截断版本上调用sanitize。

两者的结合有点棘手。我真的不能告诉你为什么sanitizetruncate的模块版本的组合在没有更多信息的情况下不起作用。你究竟在这里完成了什么(例子?)


0
投票

一个古老的问题,但在我自己挣扎的同时降落在它上面。问题是sanitize不会删除所有HTML标记,而只是默认定义的一些标记,例如script。因此,您必须指定不允许使用任何标记:

truncate sanitize(post.content, tags: [], attributes: []), length: 580


0
投票

这对我有用:

<%=  sanitize(article.description[0..100]) %>
© www.soinside.com 2019 - 2024. All rights reserved.