我正在尝试将字段从表单更改为小写,然后才能保存在数据库中。这是我的代码,但数据库的输出仍然是大写的为什么代码不工作?
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
答案 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_LOW
将name
设置为小写,因为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