2010-07-27 3 views
1

У меня есть модель телефона для телефонов в моей Thats приложений, построенной следующим образом:Виртуальных атрибутов и Rails

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

Я хочу, чтобы ограничить число, чтобы быть в формате 317.555.5555x234, поэтому я создаю форма с четырьмя ящиками (код города, 3 цифры, 4 цифры, внутр):

- 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... 

Я предполагаю, что виртуальный атрибут будет маршрут идти (а-ля Railscasts EP16), но не знаю, как соберите «число» из 4 отдельных текстовых полей.

Я думаю, что я должен был бы сделать что-то вроде этого:

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

Но я не уверен в том, как подойти к этому при сборке числа от формы входов. Есть предположения?

+0

несевероамериканских пользователи не являются проблемой? – tadman

+0

Nope ... Это регистрация событий для некоммерческой организации в Индианаполисе. Хотя есть вероятность того, что иностранный посетитель решает зарегистрироваться для бега/прогулки, это не стоит иметь дело, поскольку я сомневаюсь, что у них когда-либо был заграничный гость за одного. –

ответ

2

Я обычно делаю это как 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 

Во-первых, я бы некоторые валидаций:

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 

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

EDIT: вы хотите иметь attr_accessors для различных сегментов номера телефона:

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

Мое расширение телефона составляет 4 цифры, а в моей школе - 5 цифр. Может быть, это должен быть диапазон '{0,6}'? –

+0

хороший вызов, который, вероятно, должен быть немного более гибким. –

+0

Джефф, ты был моей спасительной изюминкой за последние несколько дней! Ха-ха, спасибо за помощь всем, я очень ценю это. Похоже, при таком подходе у вас есть поля area_code, first_three_digits, second_four_digits и т. Д. Как записи в вашей миграции, а также поле phone_number, которое объединяет все остальные поля. Могу ли я обработать эту операцию, в то время как у меня есть столбец номер_колонна в моей таблице и исключение столбцов area_code и т. Д. Таким образом, я не храню ненужные данные, но все еще имею отдельные текстовые поля на мой взгляд? –

Смежные вопросы