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