如何使用javascript以railsforms获取本地时间?

我正在使用local_time gem在用户本地时间显示日期,它适用于已添加的日期,以便在我当地时间显示它们。

我在添加新日期时遇到问题,我试图通过HTML表单传递用户本地时间(以及日期)。 我认为客户端设备有本地时间,所以我需要抓住它。

现在我正在尝试在表单中添加一个字段,如:

= simple_form_for(@link)do |f| ... = f.text_field :local_client_time, value: local_time("#{Time.now()}") 

但那显示出来了

 August 11, 2014 12:12pm" /> 

这不仅是形成错误并且实际显示(应该隐藏),而且还显示了一个时间,比我在EST上的浏览器时间提前5小时。

如何在表单上传递用户本地时间? (可能是js)?

我也不确定如何在控制器上处理它。 我现在有

 @link = Link.new(params[:link]) 

以及之后的其他一些逻辑。 我不确定如何在创建Active Record实例时让rails处理这个额外的参数(它会忽略它吗?)而且我也不知道如何使用通过隐藏字段传入的local_client_time,如同rails可用于实际设置日期字段verified_date的值的日期格式

注意:我需要为所有用户显示该字段,无论是否登录,但对于local_time gem来说似乎没问题。 唯一的问题似乎是添加一个具有时间组件的日期字段。 美国东部时间晚上8点后,它会在第二天添加,然后显示屏会反映出来。 另一个字段(’content_date’)没有这些问题但是对于该字段我只使用f.text_field :content_date, id: 'datepicker', size: 10并且控制器中没有特殊处理,数据库中没有日期字段。

两个日期字段看起来类似:

 | content_date | date | YES | | NULL | | | verified_date | date | YES | | NULL | | 

我也想知道validation日期字段是否应该实际上是日期时间而不是解决这个问题。 事情是我不关心时间组件,从不使用或显示它。 应用程序的日期/时间字段的最低粒度级别为1天。

我认为这就足够了:

 = simple_form_for @link do |f| ... = f.text_field :local_client_time # This generates some unique ID I believe. Otherwise, define one yourself: id:  # javascript var localTime = new Date(); $('').val(localTime); 

Rails将在服务器端接收此附加参数,只要它是表单的一部分即可。 您需要做的是在Active Record模型类上添加一个参数(例如local_client_time ),然后确保允许通过强参数filter (如果您使用的是Rails 4)。

如果Active Record模型上有一个字段,那么Link.new(params[:link] )应该可以解决问题,否则你需要在模型上定义一个方法( def local_client_time= ),然后处理输入。

当然也会有一些日期管理服务器端,但这不应该太成问题。

为我的应用程序解决了这个问题,有很多不同的实现与用户时区,它可以真正的方式超过一个人的头和令人畏惧的测试。 我会在底部发布链接,以便查看其他内容。

对于您的直接请求,有一个很好的gem提供jsfunction来检测客户端的时区。 请参阅此

设置完成后,您可以执行以下操作:

 $(function() { var detected_zone = Temporal.detect(); $('#user_time_zone').val(detected_zone.timezone.name); }); 

设置好时区后,可以使用Time.zone.now获取当地时间。

看看Railscasts如何在db: link中跟踪每个用户的时区