首页 > 解决方案 > 确保双筒名称大写

问题描述

在 Rails 模型中,我试图覆盖 setter 以确保first_namelast_name字段始终正确大写——用例用于 CRM,因此您希望具有人性化的名称。

这是确保名字和姓氏大写的最佳做法吗?目前,它未能通过测试。

# app/models/concerns/personable.rb

def first_name=(value)
  write_attribute(:first_name, value.humanize.gsub(/\b('?[a-z])/) { $1.capitalize })
end

def last_name=(value)
  write_attribute(:last_name, value.humanize.gsub(/\b('?[a-z])/) { $1.capitalize })
end
# test/models/customer_test.rb

test "should capitalize first and last names" do
  customer = create_customer(first_name: "MARRIE-DAY", last_name: "kennedy")
  assert_equal customer.name, "Marrie-Day Kennedy"
end

test "#name returns a affixed surname" do
  customer = create_customer(first_name: "Test", last_name: "McKay")
  assert_equal "Test McKay", customer.name
end

Failure:
CustomerTest#test_#name_returns_a_affixed_surname:
Expected: "Test McKay"
Actual: "Test Mckay"

标签: ruby-on-railsregexruby

解决方案


humanizeMcKay变为Mckay,因此在这种情况下将不应用最后一个替换逻辑。

您可以尝试在之前的那些大写字符上添加一个标记humanize,例如McKay-> Mc|K|ay,以便我们仍然知道需要在哪里转大写,如下代码:

class Helper
 def self.format_name(name)
    name.gsub(/([^A-Z])\B([A-Z])/) {"#{$1}{#{$2&.capitalize}}"}
    .humanize
    .gsub(/\{([a-z])\}?/){$1.capitalize}
    .gsub(/\b([a-z])/) {$1.capitalize}
 end
end

Helper.format_name("Kennedy") # Kennedy
Helper.format_name("McKay") # McKay
Helper.format_name("MARRIE-DAY") # Marrie-Day

推荐阅读