2012-01-06 76 views
4

我有一個狀態欄的用戶模型。而不是每次做字符串比較喜歡這個Rails中的ActiveSupport :: StringInquirer

user.status == 'verified' 

不過,我覺得我應該做

user.status.verified? 

,所以我說下面的代碼

def status 
    ActiveSupport::StringInquirer.new(self.status) 
    end 

但現在我越來越棧層次過深這是可以理解的。我該如何解決?

我正在使用Rails 3.2。

回答

15

您的問題是您在status方法內調用status,這會導致無限遞歸問題。

大多數答案在這裏重點介紹如何使用的ActiveSupport :: StringInquirer初始化,就像這樣:

def status 
    return unless self['status'] 
    ActiveSupport::StringInquirer.new(self['status']) 
end 

但你並不需要它。的ActiveSupport增加了一個詢問方法的所有字符串,那麼你可以做這樣的:

def status 
    self['status'].try(:inquiry) 
end 

這是與使用read_attribute

def status 
    read_attribute(:status).try(:inquiry) 
end 

或者,你可以調用超:

def status 
    super.try(:inquiry) 
end 
+0

非常完整的答案! – caesarsol 2015-11-09 18:20:20

2

使用下面的代碼,以防止「堆棧級別太深」錯誤:

def status 
    ActiveSupport::StringInquirer.new(self['status']) 
end 
2

您可能需要閱讀部分ActiveRecord的「重寫默認的訪問器」 :: Base的文檔:http://api.rubyonrails.org/classes/ActiveRecord/Base.html

基本上,你將使用read_attribute和write_attribute(或者像Baldrick指出的self ['attribute'])來訪問底層屬性,而不用調用實際的屬性訪問器方法。

0

接受的答案不處理屬性爲零的情況。這是更好的:

def status 
    (read_attribute(:status) || "").inquiry 
end 
相關問題