【问题标题】:Rails Handling User specific timezoneRails 处理用户特定时区
【发布时间】:2015-12-03 17:51:19
【问题描述】:

我想在当前用户登录的时区显示其他用户创建的日期时间。

我遇到过

config.time_zone = 'Central Time (US & Canada)' and
config.active_record.default_timezone = :local

但是如何将其设置为当前登录用户的时区,它是否会保存其他用户在其时区保存的日期时间并在其特定时区查看其他用户?

【问题讨论】:

    标签: ruby-on-rails datetime ruby-on-rails-4 timezone


    【解决方案1】:

    在您的ApplicationController 中考虑此代码。

    around_action :switch_time_zone, :if => :current_user
    
    def switch_time_zone(&block)
      Time.use_zone(current_user.time_zone, &block)
    end
    

    它使用Time.use_zone( current_user.time_zone ) 包装当前请求,它将应用程序的当前时区设置为整个请求的当前用户的时区,并且应该使您的所有时间都呈现在当前用户的时区中,除非专门转换为时区。

    【讨论】:

    • 谢谢,你分享的文章很有帮助
    • 这真的是天才。刚刚实现了它,所以我不确定它是否有任何副作用或影响。
    • 应该是around_action,而不是before_action railscasts.com/episodes/… api.rubyonrails.org/v4.2.5.2
    • 同意之前的评论。这种方法容易出错。强烈推荐使用around_filter
    【解决方案2】:
    class ApplicationController < ActionController::Base
      around_filter :set_time_zone
    
      def set_time_zone
        if logged_in?
          Time.use_zone(current_user.time_zone) { yield }
        else
          yield
        end
      end
    end
    

    http://api.rubyonrails.org/v4.2.5.2/classes/Time.html#method-c-zone-3D

    【讨论】:

      【解决方案3】:

      使用这个宝石https://github.com/basecamp/local_time

      <%= local_time(@time.created_at) %>
      

      你只需要像这样传递对象,它就会呈现用户登录的本地时间。不需要获取当前用户的本地时区。它使时间渲染非常平静:P

      【讨论】:

        【解决方案4】:

        我们有一个亚欧互动网站。我们以 UTC 时间保存所有内容

        那么我们只给用户时区的时间。

        =comment.created_at.in_time_zone
        

        【讨论】:

          【解决方案5】:

          首先,您需要在客户端确定用户的时区并将其传递给控制器​​。您可以在 cookie 中设置它:

          jQuery(function() {
            var tz = jstz.determine();
            $.cookie('timezone', tz.name(), { path: '/' });
          });
          

          然后在您的应用程序控制器中:

          class ApplicationController < ActionController::Base
            around_filter :set_user_time_zone
          
            private
          
            def set_user_time_zone
              timezone = Time.find_zone(cookies[:timezone])
              Time.use_zone(timezone) { yield }
            end
          end
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-08-28
            • 2014-03-28
            • 2011-10-11
            • 1970-01-01
            • 2011-08-25
            • 2020-01-06
            相关资源
            最近更新 更多