Ответ 1
downcase
возвращает копию строки, не изменяет сама строка. Вместо этого используйте downcase!
:
def downcase_fields
self.name.downcase!
end
Подробнее см. .
Я пытаюсь изменить поля из формы в нижний регистр, прежде чем они будут сохранены в базе данных. Это мой код, но вывод из базы данных по-прежнему в верхнем случае, почему не работает код?
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
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
в нижний регистр, запустив self.name.downcase
, потому что #downcase
не изменяет строку, а возвращает ее. Вы должны использовать метод взрыва downcase
self.name.downcase!
Тем не менее, есть еще один способ, которым я хотел бы сделать это в модели:
before_save { name.downcase! }
Вам нужно использовать восклицательный знак после вызова метода, если вы также хотите сохранить результат операции для переменной. Таким образом, вы будете полезны:
self.name.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
Другой простой пример с меньшим количеством кода:
class Transaction < ActiveRecord::Base
validates :name, presence: true
validates :amount, presence: true, numericality: true
before_save { self.name.downcase!}
end
Надеюсь это поможет!