2012-08-13 90 views
1

我想要生成title,first_name,middle_namelast_name的全名。例如比利鲍勃桑顿先生。但titlemiddle_name是可选的,我不想得到任何领先或双重空间。我已经想出了很多方法来做他们,但没有一个看起来很优雅。这里是我的技术,到目前为止在Ruby中设置全名的最简洁方式是什么?

full_name = "#{title} #{first_name} #{middle_name} #{last_name}" 
#FAIL. Leading and double spaces result 

full_name = "#{title} #{first_name} #{middle_name} #{last_name}".gsub(/^ /,'').gsub(/ /,' ') 
#Works but all that regex tacked on the end is very ugly 

full_name = "#{title}#{title.nil? || title.empty? ? '' : ' '}#{first_name} #{middle_name}#{middle_name.nil? || middle_name.empty? ? '' : ' '}#{last_name}" 
#Works but goes on forever 

我将使用导轨这样可以减少我的.nil? || .empty?.blank?,使最后一个稍微更简洁,但我不禁想到,有一个更好的方式。

+0

别忘了后缀:如果你还没有看过“少年”,“第三”等 – 2012-08-13 03:07:23

+0

你应该有这样一个阅读: http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ – matt 2012-08-13 05:12:36

+0

我还没有看到@matt,它引起了我作为一长串投诉和问题,而不是许多(任何)解决方案。作为名字中有撇号的人,我非常了解严格限制姓名的问题。 – brad 2012-08-13 06:30:41

回答

8

您使用Rails的,所以你可以访问String#squish

挤()

返回字符串,首先删除全部白色字符串两端的空间,然后将剩余的连续空白组分别变为一个空格。

所以,你可以这样做:

name = "#{title} #{first_name} #{middle_name} #{last_name}".squish 
+0

+1我喜欢'挤压'的方法,因为如果组成部分的名称有前导或尾随空格,只用'''连接的方法看起来不太好,比如,这些价值来自于形式因素。 – 2012-08-13 03:32:12

+0

哦,那太棒了。已经使用Rails几年了,从来没有发现过这个 - 应该更彻底地阅读。 – brad 2012-08-13 06:28:20

2

退房Ruby的String#squeezeString#strip

>> title="" 
=> "" 
>> first_name="Alice" 
=> "Alice" 
>> middle_name="" 
=> "" 
>> last_name="" 
=> "" 
>> full_name = "#{title} #{first_name} #{middle_name} #{last_name}".squeeze(" ").strip 
=> "Alice" 
>> last_name="Wu" 
=> "Wu" 
>> full_name = "#{title} #{first_name} #{middle_name} #{last_name}".squeeze(" ").strip 
=> "Alice Wu" 

推广到功能应该很容易。

+0

Rails将这两种方法封装在'String#squish'中,因为它是如此常见的操作。 – 2012-08-13 03:02:47

+0

哦,这是一个不错的。我一直有意要看看Rails多年。不知道他们如何扩展'String'。有一天....... :) – 2012-08-13 03:30:19

2

您是否在寻找类似的东西?

[title, first_name, middle_name, last_name].compact.reject(&:empty?).join(' ') 

使用Rails

[title, first_name, middle_name, last_name].select(&:present?).join(' ') 
0
[title, first_name, middle_name, last_name].select({|v| v.present?}).join(' ') 
相关问题