2012-01-06 61 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 
相关问题