2010-07-27 5 views
1

J'ai un modèle de téléphone pour les numéros de téléphone dans mes thats application construite comme suit:attributs virtuels et Rails

t.column  :number, :string 
t.references :phoneable, :polymorphic => true 

Je veux limiter le nombre d'être du format 317.555.5555x234, donc je crée un formulaire avec quatre cases (code de zone, 3 chiffres, 4 chiffres, ext):

- form_for @user do |user_form| 
    -user_form.fields_for :phones do |phone| 
    = phone.text_field :area_code 
    = phone.text_field :first_three_digits 
    etc... 

Je suppose un attribut virtuel serait la voie à suivre (à la Railscasts EP16), mais pas sûr de savoir comment assembler le "nombre" des 4 champs de texte séparés.

Je pense que je devrais faire quelque chose comme ceci:

def full_number=(phone) 
    self.number = area_code+"."+first_three_digits+"."+second_four_digits+"."+extension 
end 

Mais je ne suis pas certain de la façon d'aborder ce dans l'assemblage du nombre d'entrées de formulaire. Des pensées?

+0

Utilisateurs non-Amérique du Nord ne sont pas un problème? – tadman

+0

Non ... Il s'agit d'un enregistrement d'événement pour un organisme à but non lucratif basé à Indianapolis. Bien qu'il y ait une chance qu'un visiteur étranger décide de s'inscrire pour une course ou une marche, cela ne vaut pas la peine de faire affaire avec lui car je doute qu'il ait déjà eu un visiteur étranger. –

Répondre

2

Je normalement cela comme un before_save:

before_save :update_phone_number 

def update_phone_number 
    self.phone_number = [area_code, first_three_digits, second_four_digits, extension].reject(&:blank?).join('.') 
end 

D'abord j'aurais quelques validations:

validates_presence_of :area_code, :first_three_digits, :second_four_digits 
validates_format_of :area_code, :with => /\d{3}/ 
validates_format_of :first_three_digits, :with => /\d{3}/ 
validates_format_of :second_four_digits, :with => /\d{4}/ 
validates_format_of :extension, :with => /\d{0,6}/, :allow_blank => true 

Ceci est juste pour vous assurer que vous obtenez des données valides dans votre numéro de téléphone et votre avant d'enregistrer ne jette aucune erreur. J'ai également supposé que vous autoriseriez l'extension à être vide, mais est facilement modifiable.

EDIT: vous voulez avoir attr_accessors pour les différents segments du numéro de téléphone:

attr_accessor :area_code, :first_three_digits, :second_four_digits, :extension 
+0

L'extension de mon téléphone est à 4 chiffres, et à mon école, elle est à 5 chiffres. Peut-être que ce devrait être une plage '{0,6}'? –

+0

bon appel, qui devrait probablement être un peu plus flexible –

+0

Geoff, vous avez été ma grâce d'épargne ces derniers jours! Haha, merci pour tout l'homme d'aide, je l'apprécie vraiment. Il semble que, avec cette approche, vous ayez les zones area_code, first_three_digits, second_four_digits, etc. comme entrées dans votre migration, ainsi qu'un champ phone_number qui rejoint tous les autres champs. Puis-je gérer cette opération en ayant seulement la colonne phone_number dans ma table et en omettant les colonnes area_code, etc. De cette façon, je ne stocke pas de données inutiles, mais j'ai toujours les text_fields séparés à mon avis? –

Questions connexes