我有一个状态列的用户模型。而不是每次都像这样进行字符串比较
user.status == 'verified'我觉得我应该这么做
user.status.verified?因此,我添加了以下代码
def status
ActiveSupport::StringInquirer.new(self.status)
end但现在我的堆栈级别太深了,这是可以理解的。我该如何解决这个问题?
我使用的是Rails 3.2。
发布于 2013-08-22 16:39:55
您的问题是在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或者你可以直接调用super:
def status
super.try(:inquiry)
end发布于 2012-01-07 05:43:36
使用以下代码来防止“堆栈级别太深”的错误:
def status
ActiveSupport::StringInquirer.new(self['status'])
end发布于 2012-10-19 23:30:19
您可能需要阅读ActiveRecord::Base的documentation:http://api.rubyonrails.org/classes/ActiveRecord/Base.html中的“覆盖默认访问器”一节
本质上,您将使用read_attribute和write_attribute (或自身的‘attribute’,如Baldrick pointed)来访问底层属性,而无需调用实际的属性访问器方法。
https://stackoverflow.com/questions/8764391
复制相似问题