Rails标题为"(s)"

时间:2015-01-24 00:14:34

标签: ruby-on-rails

我默认标题化所有简单的表单字段标签,这很棒,我想出了如何添加首字母缩略词以保持在inflections初始化程序中的大写,这很酷! (所以" USA"留下" USA"并且不会成为" Usa")。但是,我陷入了标点问题。

"状态(S)"成为"州(S)"经过标题化后。 和" State / s"也变成"州/ S"。

任何想法如何为这样的案例添加例外,以便它不会将最后的资本化为#34; S"?

1 个答案:

答案 0 :(得分:2)

您可以查看code for the Rails titleize method on github,然后您会看到正则表达式作为参数发送到gsub:

/\b(?<!['’`])[a-z]/

如上所述,gsub会获取表达式中的每个匹配字符并将其大写。

测试Ruby正则表达式的一个很好的资源是rubular.com。你可以粘贴正则表达式(不要忘记它已经给你领先和尾随'/')并尝试不同的字符串来查看匹配的内容。

这是使用上述正则表达式的a quick test。你会看到,“街灯(S)”不仅被破坏了(获得第二个资本S,但是“Feee-Ling”被破坏了 - 获得资本L。

在这种情况下,问题的关键是正则表达式中的部分:

['’`]

...我推断......用于识别各种撇号以使所有权和收缩正确。如果你要放(在括号内,你的问题将被修复。去试试rubular。观看突出显示消失!

我无法确定猴子修补Rails方法的后果。但你可以写自己的!

def titleize_optional_plurals(word)
  humanize(underscore(word)).gsub(/\b(?<!['’`(])[a-z]/) { $&.capitalize }
end