2010-07-27 183 views
1

我有個電話號碼,手機型號內置爲我的應用程序多數民衆贊成如下:虛擬屬性和Rails的

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

我想限制數量是格式317.555.5555x234的,所以我創建用四個箱(區號,3位,4位,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... 

我假設虛擬屬性將是路線走(一拉railscasts EP16),但不知道如何從4個獨立的text_fields組裝「數字」。

我想我會做這樣的事情:

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

但我不確定如何在自組裝的形式輸入的數量接近這一點。有什麼想法嗎?

+0

非北美用戶是不是一個問題? – tadman 2010-07-27 17:18:40

+0

不...這是基於印第安納波利斯非營利組織的活動註冊。雖然外國遊客決定報名參加跑步/散步的機會不大,但我不懷疑他們曾經有過一位海外遊客。 – 2010-07-27 17:21:19

回答

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 

這只是爲了確保你在你的手機號碼,有效數據的保存之前不會拋出任何錯誤。我還假設你會允許擴展名爲空,但很容易改變。

編輯:你會希望有電話號碼的不同部分attr_accessors:

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

我的電話分機號碼是4位數字,在我的學校是5位數字。也許它應該是一個範圍'{0,6}'? – 2010-07-27 17:49:24

+0

良好的通話,這可能需要更靈活 – 2010-07-27 17:55:43

+0

傑夫,你是我最後幾天的保存優雅!哈哈,謝謝所有幫助的人,我真的很感激。 看起來像這樣,在遷移過程中,您可以使用area_code,first_three_digits,second_four_digits等作爲條目以及連接所有其他字段的phone_number字段。我是否可以處理此操作,同時只在表中存在phone_number列,並且不顯示area_code等列。這樣我不存儲不必要的數據,但在我看來仍然有單獨的text_fields? – 2010-07-27 18:13:09