怎么做更好的零检查?

时间:2013-09-11 09:52:28

标签: ruby-on-rails ruby refactoring

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

当我试着打电话

@user.subscription.active?

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

  def active_subscription?
    if !self.subscription.nil?
      if self.subscription.active?
        return true
      else
        return false
      end
    else
      return false
    end
  end

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

以下是订阅模型中检查订阅状态是否有效的方法

def active?
 status == 'active'
end

5 个答案:

答案 0 :(得分:8)

这应该没问题:

def active_subscription?
  subscription && subscription.active?
end

甚至更短:

def active_subscription?
  subscription.try(:active?)
end

要确保此方法可以返回的唯一值是truefalse,您可以:

def active_subscription?
  !!subscription.try(:active?)
end

答案 1 :(得分:5)

您可以使用delegate

class User < ActiveRecord::Base
  has_one :subscription
  delegate :active?, to: :subscription, prefix: :subscription, allow_nil: true
  # ...
end

现在你可以打电话了

user.subscription_active?

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

答案 2 :(得分:1)

def active_subscription?
  subscription && subscription.active?
end

答案 3 :(得分:1)

使用安全导航,您可以使用@user.subscription&.active

在调用方法之前检查nil。

答案 4 :(得分:0)

你可以这样做

@user.subscription.active? if @user.subscription.present?