Ruby on Rails:before_保存字段为小写

zzlelutf  于 2022-11-04  发布在  Ruby
关注(0)|答案(6)|浏览(146)

我试图在将表单中的字段保存到数据库之前将其更改为小写。这是我的代码,但数据库的输出仍然是大写。为什么代码不起作用?

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
pb3s4cty

pb3s4cty1#

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

def downcase_fields
  self.name.downcase!
end

有关详细信息,请参阅文档。

fkaflof6

fkaflof62#

您并不是通过运行self.name.downcase来将name设置为小写,因为#downcase不会修改字符串,它会返回该字符串。

self.name.downcase!

但是,在模型中我喜欢使用另一种方法:

before_save { name.downcase! }
niwlg2el

niwlg2el3#

String#downcase不会改变字符串,它只是返回该字符串的一个修改后的副本。

def downcase_fields
  name.downcase!
end

但是,如果您希望坚持使用downcase方法,则可以执行以下操作:

def downcase_fields
  self.name = name.downcase
end

这会将name示例变量重新分配给对name的原始值调用downcase的结果。

nfzehxib

nfzehxib4#

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

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

   before_save { self.name.downcase!}

end

希望这对你有帮助!

bvhaajcl

bvhaajcl5#

如果你还想把运算结果保存到变量中,你需要在调用方法 downcase 后使用感叹号。

self.name.downcase!

不要忘记 .downcase! 替换只在ASCII区域有效。

tf7tbtn2

tf7tbtn26#

另一个解决方案是删除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"

相关问题