1

我一直收到这个错误

#<NoMethodError: undefined method `hours' for "1":String>

更新:我收到任何数字的错误,而不仅仅是“1”

这是我要返回几个小时的代码。我正在使用这种方法

def check_hours(most_recent_snooze)
    if most_recent_snooze.duration.nil?
      return 0.hours
    else
      return most_recent_snooze.duration.hours
    end
  end

这些代码使用 check_hours(most_recent_snooze) 方法

def snoozing?
    if most_recent_snooze = Snooze.find_by_sensor_id(self.id)
      if most_recent_snooze && !(most_recent_snooze.created_at + check_hours(most_recent_snooze) < Time.now)
        # snooze is active
        return true
      else
        most_recent_snooze.destroy
        return false
      end
    end
    return false
    #self.snoozes.active.present? ? true : false
  end

  def snooze_minutes_remaining
    # (60 - (Time.now - self.snoozes.last.created_at)/60).to_i + 1
    most_recent_snooze = Snooze.find_by_sensor_id(self.id)
    distance_of_time_in_words(Time.now, most_recent_snooze.created_at + check_hours(most_recent_snooze)) if most_recent_snooze
  end

请让我知道我在此代码上哪里出错了?

更新:在 schema.rb 中,持续时间是整数

create_table "打盹", :force => true do |t|
.......
........
.........
t.integer "持续时间"
结束

4

2 回答 2

2

ActiveSupport 的时间方法只能应用于 Fixnums,而且您传入的某些数据似乎是一个字符串。也许您的数据库列格式不正确?

处理此问题的一个好方法是在您的方法中使用显式to_i转换:

def check_hours(most_recent_snooze)
  most_recent_snooze.duration.to_i.hours
end

nil.to_ireturn 0,所以在这种情况下你不需要 nil 检查。

于 2013-10-10T16:21:03.373 回答
0

您 most_recent_snooze 的持续时间,出于某种原因是一个字符串。如果你不能解决这个问题,试试这个check_hours

def check_hours(most_recent_snooze)
  if most_recent_snooze.duration.nil?
    return 0.hours
  else
    return most_recent_snooze.duration.to_i.hours
  end
end
于 2013-10-10T16:20:51.180 回答