Rails datetime_select开始时间大于用户区域时间

时间:2017-04-09 15:45:02

标签: ruby-on-rails ruby forms timezone ruby-on-rails-5

enter image description here

嗨!所以,我有一个rails应用,它在创建出价表单中有一个<%= f.datetime_select :ends_at %>字段。我希望开始时间是用户的当前时间,但允许其他用户在创建此出价后在自己的时区中查看ends_at。

所以我需要两个方面的帮助:

* 1。如何设置选择下拉菜单以显示用户当前时区的Time.now时间,以及是否使用Time.now或Time.zone.now?

* 2。如何根据查看记录的用户时区更改ends_at?

真的很感激! 谢谢:))

3 个答案:

答案 0 :(得分:1)

你有两个选择。

  1. application.rb文件中设置应用程序的时区。这将强制所有时间都在该时区。 这仅适用于您的用户位于单个时区的情况。

  2. 存储用户时区,并使用rails控制器中的around_filter更改每个请求的时区。正如Rails - Setting time_zone dynamically as per user selection

  3. 所建议的那样

    背景

    Time.zone.now只会将时间戳转换为Rails环境当前所在的时区。除非另有说明,否则始终为UTC。

    Time.now将始终返回系统时间。

    如果你落后UTC说-05:00那个时间总是向前看。

答案 1 :(得分:1)

How about setting Time.zone in the controller, which sets the time zone for the current request/thread.

You can also persist user’s time zone, and do something like:

Time.zone = current_user.time_zone

答案 2 :(得分:0)

Thanks folks! :) I solved the problem by:

  1. First of all changing the default time zone to Central Time.
  2. Then Added a new column in devise as time_zone, which user specified as per his time zone
  3. Added an around filter in application controller to ensure times are changed for a user:

    class ApplicationController < ActionController::Base around_filter :user_time_zone, if: :current_user

      private
    
      def user_time_zone(&block)
        Time.use_zone(current_user.time_zone, &block)
      end
    

    end

Found a good video by Ryan Bates: https://www.youtube.com/watch?v=X-1ISHNEB9U after using your suggestions and researching more.