怎么做更好的零检查?

gra*_*ury 2 ruby refactoring ruby-on-rails

我收到以下错误:'未定义的方法`有效吗?' 为零:NilClass'

当我试着打电话

@user.subscription.active?
Run Code Online (Sandbox Code Playgroud)

因为有时订阅尚未创建.然后我写了一个方法来检查用户是否有一个现有的有效订阅:

  def active_subscription?
    if !self.subscription.nil?
      if self.subscription.active?
        return true
      else
        return false
      end
    else
      return false
    end
  end
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来编写这个active_subscription?没有所有if else检查和/或返回语句的方法?

以下是订阅模型中检查订阅状态是否处于活动状态的方法

def active?
 status == 'active'
end
Run Code Online (Sandbox Code Playgroud)

Mar*_*pka 9

这应该没问题:

def active_subscription?
  subscription && subscription.active?
end
Run Code Online (Sandbox Code Playgroud)

甚至更短:

def active_subscription?
  subscription.try(:active?)
end
Run Code Online (Sandbox Code Playgroud)

为确保只值这个方法可以返回的truefalse,您可以:

def active_subscription?
  !!subscription.try(:active?)
end
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 5

你可以使用delegate:

class User < ActiveRecord::Base
  has_one :subscription
  delegate :active?, to: :subscription, prefix: :subscription, allow_nil: true
  # ...
end
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话了

user.subscription_active?
Run Code Online (Sandbox Code Playgroud)

如果订阅可用且缺少关联,则返回subscription.active?(即truefalse)nil.