2010-04-08 88 views
2

在Rails应用程序中的ruby中,我构建了一个项目名称和项目ID值的数组,但想要截断名称的长度。当前的代码:如何...截断数组中的字符串

names = active_projects.collect {|proj| [proj.name, proj.id]} 

我已经在努力将截断功能添加到块,但我得到了类错误未定义的方法。

在此先感谢 - 我只是不能包裹我的头呢。

+0

听起来像你在正确的轨道上。这可能是因为你只需要我的答案中的'include'来使'truncate'方法可用。 – mikej 2010-04-08 15:10:11

回答

1

假设我正确理解这个问题:

max_length = 10 # this is the length after which we will truncate 
names = active_projects.map { |project| 
    name = project.name.to_s[0..max_length] # I am calling #to_s because the question didn't specify if project.name is a String or not 
    name << "…" if project.name.to_s.length > max_length # add an ellipsis if we truncated the name 
    id = project.id 
    [name, id] 
} 
+0

太好了 - 我用过这个。 – ander163 2010-04-13 16:27:58

1

尝试以下

name=[] 
active_projects.collect {|proj| name << [proj.name, proj.id]} 

编辑了这个应该是

names= active_projects.collect {|proj| [proj.name.to_s[0..10], proj.id]} 
+0

这看起来像它将连接字符串,而不是截断它们。 – pkaeding 2010-04-08 14:32:17

+0

事实上,它和OP完全一样,只有更糟和语义错误。 – 2010-04-08 14:40:12

+0

它会产生像名称= [['salil',1],['ander','2']]的o/p。 虽然没有检查。 – Salil 2010-04-08 14:40:52

0

在Rails应用程序可以使用truncate方法此。

如果你的代码是不是在一个视图中,那么你将需要包括TextHelper模块,以使可用的方法:

include ActionView::Helpers::TextHelper 

那么你可以做:

names = active_projects.collect { |proj| [truncate(proj.name), proj.id] } 

的默认行为是截断为30个字符并用'...'替换被删除的字符,但是这可以被覆盖如下:

names = active_projects.collect { 
    # truncate to 10 characters and don't use '...' suffix 
    |proj| [truncate(proj.name, :length => 10, :omission => ''), proj.id] 
} 
+0

该功能位于模型中,而不是视图中。我将你建议的行添加到project.rb文件中,但仍然得到与最初报告相同的错误。将项目名称(这是一个字符串)作为一个数组并将前n个字符拉到目前为止的简单方法。谢谢。 – ander163 2010-04-13 16:19:31