1

我正在为一个应用程序编写一个小更新程序,它将在有人最后一次登录应用程序时更新,然后保存它。它在 rails 3.2 和 ruby​​ 1.9.3p327

def update_last_seen
  if current_account.present?
    if (Date.current - 1.day) > current_account.last_login_at
      current_account.last_login_at = Date.current
      current_account.save
    end
  end
end

我将它插入应用程序控制器并使用前置过滤器调用它。唯一的问题是,有时我的日期为零。因此将日期与 nil 进行比较会产生错误。你不能在零上调用 to_date。

nil.to_f => 0.0
nil.to_i => 0
nil.to_s => ""
nil.to_date => NoMethodError: undefined method `to_date' for nil:NilClass
"2013/07/26".to_date => Fri, 26 Jul 2013

我怎样才能将其设置为被接受为空白日期。

我总是可以

if current_account.last_login_at.blank? || (Date.current - 1.day) > current_account.last_login_at

这样,如果它不存在,它将设置它,但是否有语义的方式来做到这一点?

更新:

你可能认为这是没有意义的。我问的原因是因为有些引擎的日期为零。例如 excel 将以两种方式返回日期 1. 作为文本"06/12/2013"或 2. 整数作为从 1900 年 1 月 1 日开始的天数。该日期优于nil日期,我希望 Ruby 有一个 nils 的默认日期。如果没有,您可以发表评论,不,没有对不起的人。在没有解释原因的情况下投反对票意味着您真的不关心帮助/教任何您只是在那里按下按钮的东西。如果我在这个问题上做错了什么,你可以告诉我我试着修复它,如果它没有意义?

4

2 回答 2

2

您可以添加另一种方法来稍微清理代码。

def new_login_since?(last_login)
    last_login.blank? || (Date.current - 1.day) > last_login
end

def update_last_seen
  if current_account.present? && new_login_since?(current_account.last_login_at)
    current_account.update_attributes { last_login_at: Date.current }
  end
end
于 2013-09-26T12:58:31.297 回答
1

要回答实际的问题......你可以NilClass像这样猴子补丁

class NilClass
  def to_date
    Date.today
  end
end

nil.to_date  # => #<Date: 2013-09-26 ((2456562j,0s,0n),+0s,2299161j)>

当然,接受的答案显示了更好的方法。

于 2013-09-26T21:22:41.733 回答