在 Rails 视图中截断 + 清理

Posted

技术标签:

【中文标题】在 Rails 视图中截断 + 清理【英文标题】:Truncate + Sanitize in Rails Views 【发布时间】:2013-08-04 20:45:20 【问题描述】:

我今天在尝试将 sanitize 和 truncate 结合使用来为我的博客创建摘录时遇到了一个小问题。每种方法都单独工作,但一起使用只会截断。我尝试了这两种语法(前者在一篇名为“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'

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

一个老问题,但我自己在努力解决这个问题时遇到了这个问题。问题是sanitize 不会去除所有的html 标签,只会去除一些默认定义的标签,比如script。因此,您必须指定不允许使用任何标签:

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

【讨论】:

【参考方案3】:

这对我有用:

&lt;%=  sanitize(article.description[0..100]) %&gt;

【讨论】:

【参考方案4】:

谢谢鲁本,

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

在 Rails 6 中完美运行。 我们的经验是,所有其他带有截断的组合都不起作用。

【讨论】:

请将这些类型的答案作为评论发布在其他人的答案下。这也是写感谢信的最佳地点,只要它伴随着赞成票,否则快速找到最佳答案对社区没有任何好处。

以上是关于在 Rails 视图中截断 + 清理的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails 助手渲染部分

Rails 4:使用内置 HTML 清理时禁用自动 CSS 清理

iphone视图被截断了

使用“锁定”截断/填充从 Oracle 中的视图填充表

有没有办法在Django的视图中截断单词?

更改为等宽数字字体后,Cocoa NSTextField 文本在视图中被截断