Виртуальные атрибуты и рельсы - PullRequest
1 голос
/ 27 июля 2010

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

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

Я предполагаю, что виртуальный атрибут будет маршрутом (a la railscasts ep16), но не уверен, каксобрать "число" из 4 отдельных текстовых полей.

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

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

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

1 Ответ

2 голосов
/ 27 июля 2010

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

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

РЕДАКТИРОВАТЬ: вам понадобится attr_accessors для разных сегментов телефонного номера:

attr_accessor :area_code, :first_three_digits, :second_four_digits, :extension
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...