ArgumentError在Ruby版本1.8.6上创建Time类的实例

时间:2014-01-09 15:55:33

标签: ruby-on-rails ruby

我正在尝试使用视图中的datetime_select获取时间值,返回的值是:

"scheduletime"=>{"scheduletime(1i)"=>"2014", "scheduletime(2i)"=>"1", "scheduletime(3i)"=>"9", "scheduletime(4i)"=>"10", "scheduletime(5i)"=>"33"}

在控制器中我试图使用datetime_select的返回值创建Time类的实例。以下列方式。

schedule_time = Time.new(params[:scheduletime]["scheduletime(1i)"], params[:scheduletime]["scheduletime(2i)"], params[:scheduletime]["scheduletime(3i)"], params[:scheduletime]["scheduletime(4i)"], params[:scheduletime]["scheduletime(5i)"],0, "+09:00")

尝试这个我收到了以下错误。

ArgumentError (wrong number of arguments (7 for 0))

我使用的ruby版本是1.8.6。任何人都可以告诉我哪里出错了。

2 个答案:

答案 0 :(得分:2)

Ruby 1.8.6中的

Time.new不允许任何参数。请参阅official documentation

a = Time.new      #=> Wed Apr 09 08:56:03 CDT 2003
b = Time.new      #=> Wed Apr 09 08:56:03 CDT 2003
a == b            #=> false
"%.6f" % a.to_f   #=> "1049896563.230740"
"%.6f" % b.to_f   #=> "1049896563.231466"

我的建议是使用Time.utc来创建一个给定参数的日期。

您可以使用Hash#valutes_at

重写代码
Time.utc(*params[:scheduletime].values_at(%w( scheduletime(1i) scheduletime(2i) scheduletime(3i) scheduletime(4i) scheduletime(5i) )))

请注意Time.utc也接受一个可选的时区(鉴于我看到你正在传递一个)。


作为旁注,您肯定需要升级您的Ruby版本。

答案 1 :(得分:1)

The documentation似乎指出您无法将参数传递给Time.new方法。

尝试使用此功能(将使用您当前的TimeZone):

schedule_time = Time.local(params[:scheduletime]["scheduletime(1i)"], params[:scheduletime]["scheduletime(2i)"], params[:scheduletime]["scheduletime(3i)"], params[:scheduletime]["scheduletime(4i)"], params[:scheduletime]["scheduletime(5i)"],0)

# some variants, using standard TimeZone:
Time.utc(2000,"jan",1,20,15,1)  #=> Sat Jan 01 20:15:01 UTC 2000
Time.gm(2000,"jan",1,20,15,1)   #=> Sat Jan 01 20:15:01 UTC 2000
Time.local(2000,"jan",1,20,15,1)   #=> Sat Jan 01 20:15:01 CST 2000

您可能希望在此之后将TimeZone设置为另一个。