Ruby on Rails: поля before_save для нижнего регистра

Я пытаюсь изменить поля из формы в нижний регистр, прежде чем они будут сохранены в базе данных. Это мой код, но вывод из базы данных по-прежнему в верхнем случае, почему не работает код?

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

Ответ 1

downcase возвращает копию строки, не изменяет сама строка. Вместо этого используйте downcase!:

def downcase_fields
  self.name.downcase!
end

Подробнее см. .

Ответ 2

String#downcase не мутирует строку, она просто возвращает измененную копию этой строки. Как говорили другие, вы можете использовать метод downcase!.

def downcase_fields
  name.downcase!
end

Однако, если вы хотите придерживаться метода downcase, вы можете сделать следующее:

def downcase_fields
  self.name = name.downcase
end

Это переназначает переменную экземпляра имени в результате вызова нижнего регистра на исходное значение имени.

Ответ 3

Вы не устанавливаете name в нижний регистр, запустив self.name.downcase, потому что #downcase не изменяет строку, а возвращает ее. Вы должны использовать метод взрыва downcase

self.name.downcase!

Тем не менее, есть еще один способ, которым я хотел бы сделать это в модели:

before_save { name.downcase! }

Ответ 4

Вам нужно использовать восклицательный знак после вызова метода, если вы также хотите сохранить результат операции для переменной. Таким образом, вы будете полезны:

self.name.downcase!

Не забывайте, что. замена работает только в регионе ASCII.

Ответ 5

Другим решением является удаление 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

Ответ 6

Другой простой пример с меньшим количеством кода:

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

   before_save { self.name.downcase!}

end

Надеюсь это поможет!