2013-04-30 40 views
2

這使我完全瘋狂。我有一個自定義的setter和一個電話號碼字段的自定義的getter:如何使用自定義分配方法獲得質量分配

class Person < ActiveRecord::Base 
    attr_accessible :phone 

    def phone=(p) 
    p = p.to_s.gsub(/\D+/, '') 
    p = p[1..-1] if p.length == 11 && p[0] == '1' 
    write_attribute(:phone, p) 
    end 

    def phone(format=:display) 
    case format 
    when :display then return pretty_display(attributes['phone']) 
    when :dialable then return dialable(attributes['phone']) 
    else return attributes['phone'] 
    end 
end 

在case語句的方法都只是存根對我的實際執行,所以沒有必要讓這些掛斷了電話。當我直接使用對象時,這些get和set方法可以很好地工作。例如:

person = Person.find(1) 
person.phone = '(888) 123.4567'`) 
puts person.phone   # => 888.123.4567 
puts person.phone(:dialable) # => +18881234567 
puts person.phone(:raw)  # => 8881234567 

但是,當我喜歡一個person.update_attributes(:phone => '(888) 123.4567')質量分配,屬性被直接設置,繞過我的自定義setter方法,然後,因爲它不是以原始形式驗證失敗。

任何想法?

回答

0

不幸的是,似乎沒有太多的解決方案。我最終放棄了它,只是將代碼複製到before_save過濾器中。看起來很可惡,但這就是生活......