NoMethodError:“1”的未定义方法“小时”:字符串

时间:2013-10-10 16:15:26

标签: ruby time ruby-on-rails-3.2

我一直都会收到此错误

#<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里面,duration是整数

create_table“snoozes”,:force =&gt;真的做| t |
    .......
    ........
    .........
     t.integer“duration”
  端

2 个答案:

答案 0 :(得分:2)

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

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

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

nil.to_i返回0,因此在这种情况下您不需要使用nil检查。

答案 1 :(得分: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