【问题标题】:Ruby nil converted to_dateRuby nil 转换为 to_date
【发布时间】:2013-09-26 12:36:21
【问题描述】:

我正在为一个应用程序编写一个小更新程序,它将在有人最后一次登录该应用程序时进行更新,然后保存它。它在 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 进行比较会产生错误。你不能在 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. 作为从 01/01/1900 开始的天数的整数。那个日期是 excels nil 日期我希望 Ruby 的 nils 有一个默认日期。如果没有,您可以发表评论,不,没有对不起的人。在没有解释原因的情况下投反对票意味着您真的不关心帮助/教任何您只是在那里按下按钮的东西。如果我在这个问题上做错了,你可以告诉我,如果它没有意义,我会尝试修复它?

【问题讨论】:

  • 为什么两行分配和保存。而是使用 update_attributes。 current_account.update_attributes(:last_login_at => Date.current) 这样可以避免额外的显式保存调用。 update_attributes 会自动调用 save。检查这个maxivak.com/…
  • 我喜欢这样。谢谢,看起来好多了。链接也不错
  • 没错,我会更新我的答案 - 另外,如果您有 after_save 回调,您不必担心,因为创建和更新保存都会调用这些回调。

标签: ruby date comparison


【解决方案1】:

您可以添加另一种方法来清理代码一点

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

【讨论】:

  • 没问题 - 另外,刚刚看到你的编辑 - 如果你正在处理许多不同的默认“nil”日期(即:你从 Excel 中提到的那个),你可以将 nil 日期处理抽象为一个服务对象。有关Railscasts的更多信息
  • 是的,这正是我的问题。我从多个来源拉进来,而零日期的事情让事情变得一团糟。我认为服务对象将是最好的解决方案。我现在正在经历它。猜想今晚将是重构之夜。哈哈
  • 服务对象不难实现,你会睡得更好:)
【解决方案2】:

要回答实际问题...您可以像这样对NilClass 进行猴子修补

class NilClass
  def to_date
    Date.today
  end
end

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

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

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2010-10-13
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    相关资源
    最近更新 更多