我正在尝试在RoR上创建一个计算时间的应用程序。
当您按下开始按钮时,它将拉动Time.now,然后,当您按下停止并再次拉动Time.now然后计算两者之间的时间量。然后它将转换给定的秒数和整数通过to_i然后计算秒整数为小时:分钟:秒
然而,我的代码出现了问题,它在错误发生后不断抛出错误。
当前的顺序是“未定义的方法` - ”为nil:NilClass“
def create
@start_time = Time.now
end
def destroy
@stop_time = Time.now
end
def show
@total_time = hours_worked(total_time)
end
private
def total_time
total_time = @stop_time - @start_time
return total_time.to_i
end
def time_worked(seconds_worked)
hours = seconds_worked / ( 60 * 60 )
minutes = ( seconds_worked / 60 ) % 60
seconds = seconds_worked % 60
return "#{hours} + “:” + #{minutes} + “:” + #{seconds}"
end
答案 0 :(得分:3)
我认为您的根本问题是您假设您的实例变量(@start_time
和@stop_time
)在请求中保持不变。他们没有。每当您点击其中一个端点时,您就会处理一个全新的控制器实例,因此,即使您之前已拨过#create
和#destroy
,当您致电{ {1}} #show
和@start_time
都是@stop_time
。
如果您确实希望数据在请求之间保持不变,则需要某种持久性机制,即数据库或键值存储。实例变量仅在单个请求/响应周期的持续时间内保存在内存中。
答案 1 :(得分:1)
调用-
的唯一位置是total_time
方法。因为它说“NoMethod - for nil class”意味着减号之前的变量是未定义的。所以这里是@stop_time
变量。
看起来@stop_time
仅在您致电create
时定义。如果您希望代码有效,则必须先致电create
和destroy
,然后再致电total_time
。
我敢打赌,你正在按顺序运行它们 - 在其他人之前调用total_time
- 这就是你收到错误的原因。