首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails中的ActiveSupport::StringInquirer

Rails中的ActiveSupport::StringInquirer
EN

Stack Overflow用户
提问于 2012-01-07 04:55:10
回答 4查看 1.4K关注 0票数 5

我有一个状态列的用户模型。而不是每次都像这样进行字符串比较

代码语言:javascript
运行
复制
user.status == 'verified'

我觉得我应该这么做

代码语言:javascript
运行
复制
user.status.verified?

因此,我添加了以下代码

代码语言:javascript
运行
复制
  def status
    ActiveSupport::StringInquirer.new(self.status)
  end

但现在我的堆栈级别太深了,这是可以理解的。我该如何解决这个问题?

我使用的是Rails 3.2。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-22 16:39:55

您的问题是在status方法中调用status,这会导致无限递归问题。

这里的大多数答案都集中在使用ActiveSupport::StringInquirer初始化器上,如下所示:

代码语言:javascript
运行
复制
def status
  return unless self['status']
  ActiveSupport::StringInquirer.new(self['status'])
end

但你不需要它。ActiveSupport将一个查询方法添加到所有字符串中,因此您可以这样做:

代码语言:javascript
运行
复制
def status
  self['status'].try(:inquiry)
end

这与使用read_attribute相同

代码语言:javascript
运行
复制
def status
  read_attribute(:status).try(:inquiry)
end

或者你可以直接调用super:

代码语言:javascript
运行
复制
def status
  super.try(:inquiry)
end
票数 21
EN

Stack Overflow用户

发布于 2012-01-07 05:43:36

使用以下代码来防止“堆栈级别太深”的错误:

代码语言:javascript
运行
复制
def status
  ActiveSupport::StringInquirer.new(self['status'])
end
票数 2
EN

Stack Overflow用户

发布于 2012-10-19 23:30:19

您可能需要阅读ActiveRecord::Base的documentation:http://api.rubyonrails.org/classes/ActiveRecord/Base.html中的“覆盖默认访问器”一节

本质上,您将使用read_attribute和write_attribute (或自身的‘attribute’,如Baldrick pointed)来访问底层属性,而无需调用实际的属性访问器方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8764391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档