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