web-dev-qa-db-fra.com

les rails dépouillent les valeurs non numériques avant l'enregistrement

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
28
Jason Crump

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

56
Baldrick

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  
0
Ankit Varshney

Le moyen le plus simple de le faire est de muter la méthode field=:

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