我想从title
、first_name
、middle_name
和last_name
生成全名,例如比利·鲍勃·桑顿先生。但是title
和middle_name
是可选的,我不想得到任何前导或双空格。我想出了很多方法,但没有一个看起来很优雅。这是我到目前为止的技术
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?
以使最后一个更简洁,但我忍不住认为有更好的方法。
您正在使用 Rails,因此您可以访问String#squish
:
squish()
返回字符串,首先删除字符串两端的所有空格,然后将剩余的连续空格组更改为每个空格。
所以你可以这样做:
name = "#{title} #{first_name} #{middle_name} #{last_name}".squish
你会寻找这样的东西吗?
[title, first_name, middle_name, last_name].compact.reject(&:empty?).join(' ')
带导轨
[title, first_name, middle_name, last_name].select(&:present?).join(' ')
查看 Ruby's String#squeeze and String#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"
泛化到函数应该很容易。
[title, first_name, middle_name, last_name].select({|v| v.present?}).join(' ')