启动Rails时定义“当前时间”?

时间:2014-02-27 03:09:19

标签: ruby-on-rails ruby

我有一个应用程序可以根据一天中的时间更改行为,我希望能够启动服务器并测试它在不同时间的工作方式。

理想情况下,当我运行rails s时,我希望能够将时间作为参数传递,例如rails s TIME=2014-02-26 22:06:11 -0500

6 个答案:

答案 0 :(得分:2)

在config / locales / application.rb中,您可以在运行rails s之前设置时区。

config.time_zone = 'Alaska'

如果您正在运行OS X,您还可以在运行rails之前在终端中设置系统时间。

date 022611002013

格式为[月] [日] [hh] [mm] [年],因此以上是2013年2月26日11:00。您可以将系统时间更改回终端或日期中的当前时间和时间偏好面板。

答案 1 :(得分:1)

Rails服务器使用主机的时间。因此,如果您在本地计算机上运行,​​那么更改本地操作系统的时间也会对您的rails服务器产生影响

如果它托管在另一台服务器上,那么你必须改变该服务器的时间。

答案 2 :(得分:1)

请勿尝试更改服务器的时间。这可能会对cron工作或其他基于时间的服务造成严重破坏。

相反,您是否尝试将开始时间定义为代码中的特定值,然后运行服务器?然后将其设置为下次需要,然后再次运行服务器?

Time.new(2013, 12, 31, 12, 59, 59) # => 2013-12-31 12:59:59 -0700

您还可以将时间用作整数,使用表示您希望服务器认为的时间的秒数。将其作为ENV哈希元素传递,然后检查它是否已定义。如果是,则根据该值定义时间,否则不定义ENV值,服务器将正常运行:

ENV['SERVER_TIME'] = '1388519999'
server_time = ENV['SERVER_TIME'] ? Time.at(ENV['SERVER_TIME'].to_i) : Time.now
server_time # => 2013-12-31 12:59:59 -0700

然后,当您需要测试服务器时,您可以编写一个小shell脚本来设置该值并运行rails s,测试服务器然后退出它,然后使用不同的值重新运行shell脚本。 / p>

答案 3 :(得分:1)

您实际上可以从rails(实际上是Ruby)中读取环境变量。这是怎么做的:

require 'date'
$startup_time = DateTime.parse(ENV['STARTUP_TIME']) rescue DateTime.now
puts "Server started at: #{$startup_time}"

您可以将此代码称为pull_time.rb,如下所示:

STARTUP_TIME="2014-02-26 22:06:11 -0500" ruby pull_time.rb

为了让这个全局变量在Rails中起作用,你想将它添加到初始化器中。

所以将上面的代码放在config/initializers/set_startup_time.rb

您现在可以在代码中的任何位置访问$startup_time。只需将STARTUP_TIME作为环境变量传递给rails。

STARTUP_TIME=2014-02-26 22:06:11 -0500 rails s

答案 4 :(得分:0)

Rails服务器确定来自主机的时间

因此改变系统的时间就可以了解

修改 作为' sevenseacat'在评论中说:

您还可以使用gem timecop测试您的应用,而无需更改系统的时间。

答案 5 :(得分:0)

您可以通过将config.time_zone = 'Pacific'添加到application.rb来更改Rails的内部时区。

如果您要部署到Heroku,您可以采用稍微不同的方式:heroku config:add TZ="Europe/Athens"

然而,缺点是这些命令都不允许您为应用程序定义特定的时间(只是时区,因此您可以在另一个时区获得当前时间),也无法运行这些来自命令行,在启动本地Rails服务器时。