限制字符/单词在视图中 - Ruby on Rails

35
我正在构建一个非常简单的Ruby on Rails博客应用程序,并在主页上显示最近的评论。我想限制从“评论”表中的“正文”列显示的字符数。我假设只需在“<%=h comment.body %>”代码末尾添加一些内容即可,但由于我对Ruby和Rails都很新,不知道该添加什么。
这是我在 /views/posts/index.html.erb 文件中的代码:
<% Comment.find(:all, :order => 'created_at DESC', :limit => 5).each do |comment| -%>
    <p>
        <%=h comment.name %> commented on 
        <%= link_to h(comment.post.title), comment.post %><br/>
        <%=h comment.body %>
        <i> <%= time_ago_in_words(comment.created_at) %> ago</i>
    </p>
    <% end -%>
4个回答

81

尝试使用truncate视图助手。

<%=h truncate(comment.body, :length => 80) %>

只是好奇(不是Rails用户):这个也能用吗?<%=h comment.body [0,80] +“...”%> - steenslag
这基本上就是 truncate 在底层所做的事情,但它还会检查长度以确定是否在末尾添加“...”。 - Corey
只是想补充一下,truncate 不支持多字节(ruby 1.8,rails 2.3.5,不确定 ruby 1.9)。它会在指定的字节处截断字符串,如果你有一个 Unicode 字符串,输出将会比指定长度短(字符数少于指定长度)。你也可能最终得到一个损坏的字符。当然,如果你使用 ASCII 或任何其他 8 位字符编码,就没有什么可担心的了。 - Teoulas
1
开头的 'h' 是什么意思?还是打错了? - ProGrammar
@ProGrammar不是笔误,因为它被多次使用;但我想知道是否有一个内置的应该了解的简写(就像jjavascript转义助手的简写一样)。 - Sampson Crowley

34

我刚找到了另一种方法(如果您不想添加“...”)

<%= comment.body.first(80) %>

如在RoR String API中所述:

first(limit = 1)

返回第一个字符。如果提供了限制,则返回字符串从开头开始到达到限制值的子字符串。如果给定的限制大于或等于字符串长度,则返回自身。

comment = "1234567890"

comment.first(5)
# => "12345"

comment.first(10)
# => "1234567890"

comment.first(15)
# => "1234567890"

喜欢这个。谢谢。更加简洁,而且你不需要包含任何Rails视图助手来使用它。 - Joshua Pinter
1
如果文本中包含HTML标签,请使用.html_safe附加。 - Mani

8

如果您正在使用rails 4.2或更高版本,则可以使用truncate_words方法。

例如:
"在一个一切都很棒的世界里".truncate_words(3)

输出结果:"在一个世界..."


2
你可以使用truncate方法来限制字符数量。
<%= "#{message.truncate(charcount)}" %>

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