Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 用轨道截断字符串?_Ruby On Rails_Ruby_Truncate - Fatal编程技术网

Ruby on rails 用轨道截断字符串?

Ruby on rails 用轨道截断字符串?,ruby-on-rails,ruby,truncate,Ruby On Rails,Ruby,Truncate,我要按如下方式截断字符串: 输入: string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" string = "abcd asfsa sadfsaf safsdaf aa...ddddd" 输出: string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" string = "abcd asfsa sadfs

我要按如下方式截断字符串:

输入:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
输出:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
看一看,它确实有一部分是你想要的。如果您测试它是否有分叉,您可以将最后的部分添加回截断部分之后

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

truncate("Once upon a time in a world far far away", :length => 17)
# => "Once upon a ti..."

truncate("Once upon a time in a world far far away", :length => 17, :separator => ' ')
# => "Once upon a..."

truncate("And they found that many people were sleeping better.", :length => 25, :omission => '... (continued)')
# => "And they f... (continued)"
在最简单的情况下:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
tr_string = string[0, 20] + "..." + string[-5,5]


这实际上是一个有趣的问题,您可能希望使用javascript而不是ruby来解决它。这就是为什么,您可能在屏幕上的某个地方显示此文本,并且您只有一定的可用宽度。因此,与其将链接(或任何文本)缩减为若干个字符,您真正想要的是确保显示的文本永远不会超过某个宽度。一个特定宽度可以容纳多少字符取决于您使用的字体、间距等(css样式)。如果您使用的是基于ruby的解决方案,那么您可以确保一切正常,但是如果您决定稍后更改样式,那么一切都可能会突然发生

因此,我推荐一种基于javascript的解决方案。我以前处理它的方式是使用。在应用程序中包含插件。然后在每次加载页面时挂接一些类似于以下内容的javascript:

function truncateLongText() {
  $('.my_style1').truncate({
    width: 270,
    addtitle: true
  });
  $('.my_style2').truncate({
    width: 100
  });
}
添加任何其他需要截断的样式以及它们应该遵守的宽度,插件完成其余的工作。这样做的另一个好处是,可以方便地将整个应用程序的所有截断逻辑放在一个地方。

没有Rails,您也可以这样做:

text.gsub(/^(.{50,}?).*$/m,'\1...')

50
是您需要的长度。

这是
String#truncate

def truncate(truncate_at, options = {})
  return dup unless length > truncate_at

  options[:omission] ||= '...'
  length_with_room_for_omission = truncate_at - options[:omission].length
  stop = \
    if options[:separator]
      rindex(options[:separator], length_with_room_for_omission) ||      length_with_room_for_omission
    else
      length_with_room_for_omission
    end

   "#{self[0...stop]}#{options[:omission]}"
end
那么,至于你的情况呢

string.truncate(37, :omission => "...ddddd")

这可能不是你问题的确切解决方案,但我认为它将帮助你走上正确的方向,以一种非常干净的方式做事

如果希望“Hello,World!”仅限于前五个字母,可以执行以下操作:

str = "Hello, World!"
str[0...5] # => "Hello"
如果需要椭圆,只需对其进行插值:

"#{str[0...5]}..." #=> "Hello..."
带自定义省略的截断 与其他人在这里建议的类似,您可以使用Rails的方法并使用一个自定义省略,它实际上是字符串的最后一部分:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

truncate(string, length: 37, omission: "...#{string[-5, 5]}")
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"
正是你想要的

加分 您可能希望使用一个名为
truncate\u middle
的自定义方法来完成此操作,该方法可以为您提供一些奇特的步法:

# Truncate the given string but show the last five characters at the end.
#
def truncate_middle( string, options = {} )
  options[:omission] = "...#{string[-5, 5]}"    # Use last 5 chars of string.

  truncate( string, options )
end
然后就这样称呼它:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

truncate_middle( string, length: 37 )
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"


谢谢你问这个问题。我认为这是一种显示较长文本片段的有用方法。

对于只使用
RUBY
而不使用
Rails
的人来说

这是一个受@yegor256的启发而设计的解决方案

使用like-so:

truncate("your very very very long message", :length => 10)
您还可以使用
省略
选项提供替换文本:

truncate("your very very very long message", :length => 10, :omission => '... more')

你的意思是在大约10个字符后简单地将其截断吗?
trancate“Hello”,5
将返回
Hello…Hello
。编辑:抱歉,错过了
字符串。size
不是string.size>=长度+8吗?如果你有25个字符长的字符串,你将得到28个字符长的字符串。@Serabe,如果你有26个字符长的字符串,你将得到28个字符。但没人在乎。2.X不支持
:separator
参数,这与长度无关,而是与TranCatingSeem(如rails)有关。无效方法截断
包括ActionView::Helpers::TextHelper
,如果不是内部视图。我同意,这肯定是客户端的事情(在大多数情况下,与MySQL索引注释不同)。但是,当客户端不是HTML5,而是ObjC或Java时会发生什么呢?如果
str
恰好少于6个字符,省略号仍将添加到末尾-如果您在控制器中并且需要从文本转换为字符串,则最好执行类似
“#{str[0..5]}#{If str length>6}”的操作,这很方便。