Ruby on Rails: перед сохранением полей в нижнем регистре
Я пытаюсь изменить поля из формы в нижний регистр, прежде чем они сохраняются в базе данных. Это мой код, но вывод из базы данных все еще в верхнем регистре, почему код не работает?
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
5 ответов
downcase
возвращает копию строки, не изменяет саму строку. Использовать downcase!
вместо:
def downcase_fields
self.name.downcase!
end
посмотреть документация для получения более подробной информации.
String#downcase
не мутирует строку, она просто возвращает измененную копию этой строки. Как говорили другие, вы можете использовать downcase!
метод.
def downcase_fields
name.downcase!
end
однако, если вы хотите придерживаться downcase
метод, тогда вы можете сделать следующее:
def downcase_fields
self.name = name.downcase
end
это переназначает переменную экземпляра name в результат вызова downcase для исходного значения name.
вы name
в downcase, запустив self.name.downcase
, потому что #downcase
не изменяет строку, она возвращает ее. Вы должны использовать bang downcase
метод
self.name.downcase!
тем не менее, есть еще один способ, который мне нравится делать в модели:
before_save { name.downcase! }
вы должны использовать восклицательный знак после вызова метода downcase, Если вы хотите сохранить результат операции в переменную. Так что для вас будет полезно:
self.name.downcase!
Не забывайте, что .downcase! замена работает только в регионе ASCII.
другое решение-удалить 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