Rails中的ActiveSupport :: StringInquirer

Nic*_*ilt 4 ruby ruby-on-rails

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

user.status == 'verified'
Run Code Online (Sandbox Code Playgroud)

我虽然应该这样做

user.status.verified?
Run Code Online (Sandbox Code Playgroud)

所以我添加了以下代码

  def status
    ActiveSupport::StringInquirer.new(self.status)
  end
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Rails 3.2.

joa*_*lho 17

你的问题是你在方法status内部调用status,这会导致无限递归问题.

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

def status
  return unless self['status']
  ActiveSupport::StringInquirer.new(self['status'])
end
Run Code Online (Sandbox Code Playgroud)

但你不需要它.ActiveSupport 为所有字符串添加查询方法,因此您可以这样做:

def status
  self['status'].try(:inquiry)
end
Run Code Online (Sandbox Code Playgroud)

这与使用read_attribute相同:

def status
  read_attribute(:status).try(:inquiry)
end
Run Code Online (Sandbox Code Playgroud)

或者你可以打电话给超级:

def status
  super.try(:inquiry)
end
Run Code Online (Sandbox Code Playgroud)