Синтаксис Ruby, чтобы избежать нулевого ввода, возвращаемого как ноль

#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