超过一定大小后截断文本

时间:2016-06-01 18:06:37

标签: ruby-on-rails ruby

当您要截断超过特定字符长度的文本时,Rails会提供truncate方法。这是here提供的示例:

truncate("Once upon a time in a world far far away")
# => "Once upon a time in a world..."

它会在给定的文本之后截断给定的文本:length如果文本长于:length

但我有以下例子:

str = "abcdefhijklmno"

在12个字符之后我希望它被截断,所以上面的文字应该是这样的:

abcdefhijklm...

但是我尝试使用truncate方法并且无法获得所需的结果:

> str = "abcdefhijklmno"
 => "abcdefhijklmno" 
> str.truncate(15)
 => "abcdefhijklmno" 
> str.truncate(14)
 => "abcdefhijklmno" 
> str.truncate(13)
 => "abcdefhijk..." 
> str.truncate(12)
 => "abcdefhij..."

我认为truncate(12)会这样做,但会在9个字符后截断。我做错了什么?

2 个答案:

答案 0 :(得分:2)

truncate的参数表示输出字符串的大小(使用" ..."):

str.truncate(13)
=> "abcdefhijk..."
str.truncate(13).size
=> 13

如果需要,您可以按空格更改默认省略(...):

str.truncate(13, omission: '')
=> "abcdefhijklmn"

有关Rails的更多信息String#truncate here

答案 1 :(得分:1)

我不相信str.truncate会做你想要的开箱即用。但由于它只是一个额外的if语句,因此很容易编写:

def trunc(str, length)
  addition = str.length > length ? '...' : ''
  "#{str.truncate(length, omission: '')}#{addition}"
end

或稍微简化,没有Rails依赖(如评论中Ilya所述):

def trunc(str, len)
  "#{str.first(len)}#{'...' if str.size > len}"
end

测试案例:

2.2.1 :005 > s = 'abcdefghijklmno'
 => "abcdefghijklmno"
2.2.1 :006 > trunc(s, 20)
 => "abcdefghijklmno"
2.2.1 :007 > trunc(s, 15)
 => "abcdefghijklmno"
2.2.1 :008 > trunc(s, 14)
 => "abcdefghijklmn..."
2.2.1 :009 > trunc(s, 13)
 => "abcdefghijklm..."
2.2.1 :010 > trunc(s, 0)
 => "..."
2.2.1 :011 > trunc(s, 1)
 => "a..."