ruby-on-rails - rails : ensure capitalization in model?

标签 ruby-on-rails activerecord input capitalization

在 Rails 模型中,如果我有一个用于专有名称的字段,那么尽管用户可能输入懒惰,但确保它们统一大写的最佳实践方法是什么?

IE 假设模型是 Contact并且该字段是 Name .无论用户输入什么,我都希望单词大写,即模型会将以下输入转换为以下输出:

john doe -> John Doe
j doe -> J Doe
John doe -> John Doe
john doe jr -> John Doe Jr

那么,您是否创建了一个 before_save回调并使用正则表达式转换字段,或者您是否创建了某种验证,或不同的东西?我非常感谢强调理由的答案,为什么你会以一种或另一种方式这样做,因为这是我最坚持的。

最佳答案

你要的方法是titleize . capitalize方法只处理整个字符串中的第一个字符,所以 "john doe".capitalize #=> "John doe" , "john doe".titleize #=> "John Doe" .

至于如何实现,你可以用 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

关于ruby-on-rails - rails : ensure capitalization in model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10210493/

相关文章:

Linux Shell "Variable"用于文件输入 "<"

jquery - 单击时,隐藏 div 并删除所需的属性

ruby-on-rails - 使用 gsub 在 Rails 中用符号替换字符串

ruby-on-rails - STI 和扩展子类以在数据库中包含 'extra' 列?

html - 没有在后面的代码中获取输入文本值

ruby-on-rails - accepts_nested_attributes_for、reject_if 和 has_one 关系不能一起工作?

ruby-on-rails - 创建时间和更新时间另存为明天

html - 在 HAML 中递增 ID 的最简单方法是什么?

ruby-on-rails - 为 Rails 3 创建插件或 gem?

ruby-on-rails - Rails : many to many Model, NoMethodError:未定义的方法