2012-08-13 89 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(' ') 
相關問題