Rails视图中的截断+清理

12

今天我在尝试结合使用sanitize和truncate为我的博客创建摘录时遇到了一个小问题。每个方法单独使用都起作用,但是一起使用时只会截断。我尝试了以下两种语法(前者在一篇题为“Six Ruby on Rails Tips & Tricks”的博客文章中推荐):

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

然后我尝试将截断代码放入控制器中,并在视图中对该对象进行了清理,但仍然无法正常工作。

最终我是这样解决的:

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

我想知道为什么当我将一个方法包装在另一个方法中时,它没有起作用?与我上次尝试的方式有何区别?

TIA 'bondibox'

4个回答

2
这对我有用:

最初的回答:

<%=  sanitize(article.description[0..100]) %>


0

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

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

第二个语句之所以有效,是因为Rails扩展了Ruby的一些基本对象,例如String,并添加了几个方法。因此,您实际上是在一个由String方法截断的字符串的截断版本上调用sanitize。

两者的组合有点棘手。我无法告诉您为什么模块版本的sanitizetruncate的组合没有更多信息就无法工作。您到底想要实现什么(例如示例)?


0
一个老问题,但是我自己也在苦苦挣扎时遇到了它。问题在于sanitize不会剥离所有的HTML标签,而只是一些默认定义的标签,比如script。所以你必须指定不允许任何标签:

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


-2

谢谢Ruben,

<%=  sanitize(article.description[0..100]) %>

在Rails 6中完美运行。 我们的经验是,所有其他与截断相关的组合都无法正常工作。


请将这些类型的答案作为评论发布在其他人的答案下面。这也是写感谢的最佳位置,只要它与赞同一起进行,否则对于快速找到最佳答案,社区没有任何好处。 - Ruben Portz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接