Дать название дефису

Метод titleize Rails удаляет дефисы, а метод Ruby capitalize не использует заглавные буквы после дефиса. Я хочу что-то вроде следующего:

"mary-joe spencer-moore" => "Mary-Joe Spencer-Moore"

"mary-louise o'donnell" => "Mary-Louise O'Donnell"

Ответ 1

Проверить реализацию Titelize, и из него вы можете получить:

"mary-joe spencer-moore".humanize.gsub(/\b('?[a-z])/) { $1.capitalize }

даст вам = > "Мэри-Джо Спенсер-Мур"

и вы можете написать для него функцию в классе строк, добавьте в intalizers:

class String
  def my_titleize
    humanize.gsub(/\b('?[a-z])/) { $1.capitalize }
  end
end

а затем из вашего кода:

"mary-joe spencer-moore".my_titleize

Ответ 2

Вы также можете получить желаемый результат, разделив строку и разделяя ее по разделам отдельно:

"mary-louise o'donnell".split('-').map(&:titleize).join('-')

Ответ 3

 %q%mary-louise o'donnell%.gsub(/\b([a-z])/) { $1.capitalize }
 => "Mary-Louise O'Donnell"

Тем не менее, если вы можете вводить данные с неожиданными заглавными буквами (например, "МЭРИ-ЛУИЗ О'ДОННЕЛЛ"), вам сначала потребуется .downcase; более того, если у вас могут быть значения nil для имени и фамилии, и вы затем присоединяетесь к ним, тогда вам понадобится .strip:

[first_name, last_name].join(' ').downcase.gsub(/\b([a-z])/) { $1.capitalize }.strip