#ruby-on-rails
#ruby-on-rails
Вопрос:
приложение Rails имеет метод очистки
def mobile=(value)
super(value.to_s.gsub(/s /, "").to_i) unless value.nil?
end
Тем не менее, при отправке через консоль
User.last.update(mobile: nil)
очевидно, что запись была обработана to_i
, возвращая 0
mobile: 0
подразумевая, что синтаксис unless value.nil?
неуместен. Как метод должен быть выражен в no fire, когда отправленное значение равно нулю?
Комментарии:
1. Какое значение
User.last.mobile
перед обновлением? И есть ли у вас какие-либо значения по умолчанию в базе данных, установленные для столбца?
Ответ №1:
Поскольку вы вызываете только super
в том случае, если значение не равно нулю, это означает, что значение НЕ заменяется, когда значение равно нулю. Итак, если значение содержит 0, то оно все равно будет содержать 0 впоследствии.
Если вы хотите иметь возможность установить значение nil, вы должны сделать…
def mobile=(value)
super(
value.nil? ? nil : value.to_s.gsub(/s /, "").to_i
)
end