And*_*rew 9 activerecord ruby-on-rails input capitalization
在Rails模型中,如果我有一个专有名称的字段,尽管用户可能有懒惰的输入,但是确保它们统一大写的最佳实践方法是什么?
IE让我们说模型是Contact和现场Name.无论用户输入什么,我希望单词大写,即模型会将以下输入转换为以下输出:
john doe -> John Doe
j doe -> J Doe
John doe -> John Doe
john doe jr -> John Doe Jr
Run Code Online (Sandbox Code Playgroud)
那么,你是创建一个before_save回调并使用正则表达式转换字段,还是创建某种验证或不同的东西?我非常欣赏答案,重点是理由,为什么你会这样或那样做,因为这是我最坚持的.
tsh*_*rif 15
你想要的方法是titleize.该capitalize方法只执行整个字符串中的第一个字符"john doe".capitalize #=> "John doe","john doe".titleize #=> "John Doe".
至于如何实现它,你可以使用a before_save,但我喜欢用伪属性做这些类型的单个属性的简单准备.基本上,您writer为属性定义一个方法,该方法将隐藏由其创建的默认属性ActiveRecord.您仍然可以使用write_attribute方法(docs)访问该属性.这样做将确保在分配属性后正确设置属性,这意味着即使在保存之前,您也可以确保对象处于有效状态:
class Contact < ActiveRecord::Base
def name=(s)
write_attribute(:name, s.to_s.titleize) # The to_s is in case you get nil/non-string
end
end
Run Code Online (Sandbox Code Playgroud)
@ tserif的清洁演绎如下:
def name=(s)
super s.titleize
end
Run Code Online (Sandbox Code Playgroud)
这消除了write_attribute对指定属性名称的依赖性和需要name,有利于更原始的方法.我不认为有必要to_s,除非你想要分配符号的能力.
| 归档时间: |
|
| 查看次数: |
6239 次 |
| 最近记录: |