2

我收到以下错误:'未定义的方法'活动?' 对于零: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
4

5 回答 5

9

这应该没问题:

def active_subscription?
  subscription && subscription.active?
end

甚至更短:

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

为确保此方法可以返回的唯一值是trueand false,您可以:

def active_subscription?
  !!subscription.try(:active?)
end
于 2013-09-11T09:55:31.620 回答
5

您可以使用delegate

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

现在你可以打电话

user.subscription_active?

如果订阅可用且关联丢失,则返回subscription.active?(即true或)。falsenil

于 2013-09-11T10:14:12.603 回答
1
def active_subscription?
  subscription && subscription.active?
end
于 2013-09-11T09:55:14.613 回答
1

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

它在调用该方法之前检查 nil。

于 2018-03-30T18:51:35.047 回答
0

你可以这样做

@user.subscription.active? if @user.subscription.present?
于 2013-09-11T09:53:58.433 回答