方法返回nil时的NoMethodError

时间:2012-11-22 01:07:49

标签: ruby-on-rails

我有两种方法可用于确定是否将某个类应用于页面以显示某些内容已过期且需要注意。

当全新用户注册时,我收到错误:

undefined method `last_contact_done_date=' for #<User:0x6183708>

它引用错误的行是:

2:   <div class="span3 <%= "overdue" if (signed_in? && contact_overdue?(current_user.id)) %>">

contact_overdue?方法就是这个(在主页帮助程序中)

def contact_overdue?(user_id)
  @user = User.find_by_id(user_id)
  return true if (Date.today - (@user.last_contact_done_date ||= Date.tomorrow)) > 6
end

和last_contact_done_date方法是User模型中的

  def last_contact_done_date
      self.contacts.order('date_done DESC').first.try(:date_done)
  end

我认为如果我在||=方法中使用contact_overdue?运算符,那么如果last_contact_done_datenil,我将返回-1。但它似乎不起作用。我应该在last_contact_done_date中使用哪个运算符,或者如何更改contact_overdue?方法,以便在没有联系人的情况下,从false方法返回contact_overdue??< / p>

1 个答案:

答案 0 :(得分:0)

要在没有上次联系完成日期时返回默认值-1,请使用

@user.last_contact_done_date || -1

(期望Date.tomorrow返回-1是不合理的;))

||=是一个赋值运算符; a ||= b相当于a = a || b;如果a是一个属性(即以点和实例为前缀,c.a),对它的赋值将调用方法a=。因此,您的代码必须使用名为last_contact_done_date=的方法来处理分配,而不是。