2014-05-16 39 views
0

我有一個問題,在運行驗證之前剝離美元符號和逗號。出於某種原因,保存時該值將被設置爲0從before_validation回調中的字符串轉換貨幣的問題

class Property < ActiveRecord::Base 
    before_validation :format_currency 

    validates :street_name_1, presence: true 
    validates :city, presence: true 
    validates :state, presence: true 
    validates :postal_code, presence: true 
    validates :rate, presence: true, numericality: true 

    private 
    def format_currency 
    self.rate = rate.to_s.gsub(/[^0-9\.]/, '').to_i # Strip out non-numeric characters 
    end 

end 

當我做'$3,500'.to_s.gsub(/[^0-9\.]/, '').to_i在軌安慰它正確返回「3500」。 rate也正在從表單中正確地傳遞給模型。

對於我的生活,我無法弄清楚爲什麼它不能正確設置保存的值。任何幫助,將不勝感激。

編輯:我需要重寫默認setter,並在設置速率時由於數據庫列是整數而執行我的gsub。

def rate=(rate) 
    write_attribute(:rate, rate.to_s.gsub(/[^0-9\.]/, '').to_i) 
end 

回答

0

既然你存儲rate列作爲一個整數,而你使用Rails,我建議你拆下format_currency方法完全。 Rails有一種處理貨幣的方法:number_to_currency

當你想輸出的價格,簡單的使用助手:

number_to_currency @property.rate 

這給了你更大的靈活性也一樣,因爲你可以本地化它,並將它傳遞了許多其他選項。 Have a look at the API

編輯,按OP編輯問題:

如果你想保存的東西在該格式,你爲什麼不申請美元正弦模型?

before_save :set_rate 
def set_rate 
    self.rate = "$#{rate}" 
end 
+0

我實際上試圖將格式($ 3,500)的東西保存到數據庫。而不是相反。我計算出來並用答案更新了我的問題。 – Mike

+0

@ user3197108查看我的更新。但是爲什麼不在保存'rate'列之前添加'$'?爲什麼打擾正則表達式的複雜性? – Mohamad

+0

我認爲你沒有正確理解我。用戶會在表單中輸入類似「$ 3,500」的東西,然後傳遞給模型。該模型有一個「比率」列,它是一個整數。我無法將$或$存儲在整數列中。我只需要原始整數。 – Mike