在Rails视图中截断+清理

时间:2013-08-03 18:57:52

标签: ruby-on-rails truncate sanitize

今天我遇到一个小问题,当我尝试使用清理和截断相互结合来创建我博客的摘录时。每个方法本身都有效,但是一起使用它只会截断。我尝试了这两种语法(前者在一篇名为&#34的博客文章中被推荐; Six Ruby on Rails提示和技巧"):

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

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

最后,我得到了这样的工作:

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

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

TIA &#39; bondibox&#39;

4 个答案:

答案 0 :(得分:0)

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

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

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

两者的结合有点棘手。我无法真正告诉您为什么sanitizetruncate的模块版本的组合在没有更多信息的情况下无效。你到底想要完成什么(例子?)

答案 1 :(得分:0)

一个古老的问题,但我自己为此苦苦挣扎。问题在于sanitize不会剥离所有HTML标记,而只会剥离默认情况下定义的一些HTML标记,例如script。因此,您必须指定不允许使用标签:

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

答案 2 :(得分:0)

这对我有用:

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

答案 3 :(得分:0)

感谢鲁宾,

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

在Rails 6中运行良好。 我们的经验是带有截断的所有其他组合均无效。