J'ai cherché et il semble que cela devrait être simple mais je n'arrive pas à le faire fonctionner. J'essaie de supprimer tous les caractères non numériques avant d'enregistrer un numéro de téléphone. C'est ce que j'ai actuellement:
before_save { |workorder| workorder.phonenumber =
phonenumber.to_s.gsub(/\D/, '').to_i }
Donc, si un utilisateur entre
925-555-5555
Cela devrait économiser 9255555555, mais en réalité, il n'enregistre que 925 et ignore tout après.
J'ai aussi essayé:
before_save { |workorder| workorder.phonenumber =
phonenumber.to_s.gsub(/[^0-9]/, "").to_i }
avec le même résultat.
Résolu:
def raw_phonenumber
self.phonenumber
end
def raw_phonenumber=(s)
self.phonenumber=s.gsub(/\D/, '')
end
Vous avez certainement défini la colonne phonenumber
en tant que nombre. C'est pourquoi, lorsque vous définissez '925-555-5555'
dans l'attribut phonenumber
, il est converti en un nombre et seul 925
est conservé.
La meilleure solution consiste à modifier le type de colonne de votre base de données en string
. Créer une nouvelle migration:
change_column :table_name, :phonenumber, :string, limit: 30
Sinon, vous pouvez remplacer le paramètre par celui-ci pour supprimer les caractères non numériques (mais les numéros de téléphone commençant par 0 ne seront pas résolus)
def phonenumber=(phonenumber)
write_attribute(:phonenumber, phonenumber.gsub(/\D/, ''))
end
Plus d'alternatives dans ce blog post
Vous pouvez créer une méthode personnalisée pour enregistrer/afficher le numéro de téléphone mobile comme suit:
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
Le moyen le plus simple de le faire est de muter la méthode field=
:
def field=(value)
super(
value.delete('^0-9')
)
end