Подтвердить что ты не робот

Рельсы разделяют не числовые значения перед сохранением

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

before_save { |workorder| workorder.phonenumber = 
                  phonenumber.to_s.gsub(/\D/, '').to_i }

Итак, если пользователь вводит

925-555-5555

Он должен сохранить 9255555555, но на самом деле он сохраняет только 925 и игнорирует все после

Я также пробовал:

before_save { |workorder| workorder.phonenumber = 
                  phonenumber.to_s.gsub(/[^0-9]/, "").to_i }

с тем же результатом.

Решено:

def raw_phonenumber
  self.phonenumber
end
def raw_phonenumber=(s)
  self.phonenumber=s.gsub(/\D/, '')
end
4b9b3361

Ответ 1

Вы, конечно, определили phonenumber столбец как число. Поэтому, когда вы устанавливаете '925-555-5555' в атрибуте phonenumber, он преобразуется в число, и сохраняется только 925.

Лучшее решение - изменить тип столбца в вашей базе данных на string. Создайте новую миграцию:

change_column :table_name, :phonenumber, :string, limit: 30

В противном случае вы можете переопределить установщик следующим образом, чтобы удалить нечисловые символы (но он не будет фиксировать телефонные номера, начинающиеся с "0"):

def phonenumber=(phonenumber)
  write_attribute(:phonenumber, phonenumber.gsub(/\D/, ''))
end

Больше альтернатив в этом посте

Ответ 2

Самый простой способ сделать это - поменять метод field=:

def field=(value)
  super(value.delete('^0-9'))
end

Ответ 3

Вы можете создать собственный метод для сохранения/отображения номера мобильного телефона, например так:

def mobile_number(arg)

if arg.downcase.include?('special chars')

phone_number = arg.downcase.split('special chars')

phone = if phone_number[0].to_i == 0 || phone_number[0].to_i.to_s.size < 10
number_to_phone(phone_number[0].gsub!(/[^0-9A-Za-z]/, '').to_i, area_code: true)
else
number_to_phone(phone_number[0].to_i, area_code: true)
end

return phone.to_s + ' Ext'+ remove_unnecessary_keywords(phone_number[1])

elsif arg.include?('(') || arg.include?(')') || arg.include?('-') || 
arg.include?('.') || arg.include?(' ')

return  number_to_phone(arg.gsub!(/[^0-9A-Za-z]/, '').to_i, area_code: true)    

else

return number_to_phone(arg.to_i, area_code: true) 

end

end