Ruby on Rails:before_save字段为小写

时间:2014-05-25 14:28:03

标签: ruby-on-rails ruby database sqlite activerecord

我正在尝试将字段从表单更改为小写,然后才能保存在数据库中。这是我的代码,但数据库的输出仍然是大写的为什么代码不工作?

class Transaction < ActiveRecord::Base
   validates :name, presence: true
   validates :amount, presence: true, numericality: true
   before_save :downcase_fields

   def downcase_fields
      self.name.downcase
   end
end

6 个答案:

答案 0 :(得分:22)

downcase返回字符串的副本,不修改字符串本身。请改用downcase!

def downcase_fields
  self.name.downcase!
end

有关详细信息,请参阅documentation

答案 1 :(得分:3)

String#downcase不会改变字符串,它只返回该字符串的修改副本。正如其他人所说,您可以使用downcase!方法。

def downcase_fields
  name.downcase!
end

但是,如果您想坚持downcase方法,那么您可以执行以下操作:

def downcase_fields
  self.name = name.downcase
end

这会将名称实例变量重新分配给名称原始值调用downcase的结果。

答案 2 :(得分:3)

您没有通过运行NotificationManager.IMPORTANCE_LOWname设置为小写,因为self.name.downcase不修改字符串,而是返回它。你应该使用爆炸#downcase方法

downcase

然而,我还有另一种方式在模型中做到这一点:

self.name.downcase!

答案 3 :(得分:1)

如果您还想将操作结果保存到变量中,则需要在调用方法 downcase 后使用感叹号。 因此,您可以使用:

self.name.downcase!

不要忘记 .downcase!替换仅适用于ASCII区域。

答案 4 :(得分:1)

其他简单代码较少的示例:

class Transaction < ActiveRecord::Base
   validates :name, presence: true
   validates :amount, presence: true, numericality: true

   before_save { self.name.downcase!}

end

希望这会有所帮助!

答案 5 :(得分:-1)

另一个解决方案是删除before_save和monkeypatch initialize方法

def initialize(args = {})
  args[:name].downcase! if args[:name]
  super
end

然后你可以说像

irb(main)> t = Transaction.new name: 'BIGTRANSACTION'

irb(main)> t.name

=> "bigtransaction