ruby-on-rails - 确保双筒名称大写
问题描述
在 Rails 模型中,我试图覆盖 setter 以确保first_name
和last_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"
解决方案
humanize
将McKay
变为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
推荐阅读
- git - AWS CodeBuild DOWNLOAD_SOURCE 错误:CLIENT_ERROR:未找到参考增量
- spring - 不按顺序同时运行 Spring 测试用例
- java - Java:如何指定相对文件路径?
- regex - Python re, 获取 findall 找到的第一个元素
- javascript - 如何创建一个foreach循环来反向打印数组?
- javascript - 如何在动态组件标签内重用vue中的组件?
- javascript - 基于 JSON 对象时如何使用 ASP 更新 URL 地址
- assembly - 两个输入并将它们相乘。如何做到这一点?
- react-native - 反应原生图像背景不是全屏
- discord - 是否可以在不和谐中使用功能性前缀文本?像悬停或可点击