今天我遇到一个小问题,当我尝试使用清理和截断相互结合来创建我博客的摘录时。每个方法本身都有效,但是一起使用它只会截断。我尝试了这两种语法(前者在一篇名为&#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;
答案 0 :(得分:0)
Truncate和Sanitize不包含在控制器中,它们分别属于ActionView::Helpers::TextHelper
和ActionView::Helpers::SanitizeHelper
。默认情况下,这些模块不包含在控制器中,因此您无法在其中使用它。
但是,两者都包含在视图(模板)中,因此您可以在那里使用它们。您可以在控制器类中包含上述模块以在那里使用它们,但我不推荐它。
第二个语句起作用的原因是因为Rails从Ruby扩展了一些基础对象,比如String
有几个methods。所以你实际上是在String
方法截断的字符串的截断版本上调用sanitize。
两者的结合有点棘手。我无法真正告诉您为什么sanitize
和truncate
的模块版本的组合在没有更多信息的情况下无效。你到底想要完成什么(例子?)
答案 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中运行良好。 我们的经验是带有截断的所有其他组合均无效。