【问题标题】:Reflect time zone selected by user on time stamps in Ruby application反映用户在 Ruby 应用程序中的时间戳上选择的时区
【发布时间】:2013-01-19 00:05:09
【问题描述】:

我想根据用户选择的时区在我的 ruby​​ 应用程序上制作每个时间戳。我是 Rails 中的 ruby​​ 新手,所以不知道该怎么做。

我制作了下拉列表供用户选择时区

<%= time_zone_select( "user", 'time_zone', ActiveSupport::TimeZone.all, :default => "Beijing")%>

如何使时区的选择反映在所有使用的时间戳上。

【问题讨论】:

    标签: ruby-on-rails timezone timestamp


    【解决方案1】:

    application_controller.rb 中使用before_filter 可确保每次请求都调用此方法。每个请求的默认时区由config.time_zone 设置,因此您必须在每个请求上更新Time.zone。看http://api.rubyonrails.org/classes/Time.html

    before_filter :set_user_timezone
    
    def set_user_timezone
      if current_user && current_user.time_zone.present?
        Time.zone = current_user.time_zone
      end
    end
    

    要使用特定时区评估表达式,请使用 Time.use_zone

    Time.use_zone('Singapore') do
      Time.zone.parse(...) # returns a time in Singapore
    end
    

    更新:使用session 保存时区

    # application_controller.rb
    before_filter :set_user_timezone
    
    def set_user_timezone
      Time.zone = session[:timezone] || 'Default timezone here'
    end
    
    # time_zone_controller.rb
    def save_time_zone
      session[:timezone] = params[:timezone]
    end
    
    # routes
    match 'save_time_zone' => 'time_zone#save_time_zone'
    
    # js
    $('#user_time_zone').change(function() {
      $.ajax({
        url: '/save_time_zone',
        data: { time_zone: $(this).val() }
      })
    })
    

    【讨论】:

    • 我得到了未定义的局部变量或方法`current_user'
    • 将上面的current_user 替换为您用来获取当前登录用户的方法。
    • 好的....如果我没有任何用户登录怎么办?那我应该用什么?实际上我的应用程序没有任何用户会话。我想使用这个时区实用程序,以便任何最终用户都可以看到他在他的时区所做的更改的时间戳。
    • 好的。我做出这个假设是因为你在上面使用了:user。如果您没有任何用户,您可能可以使用会话来保存选定的 time_zone。如果你想这样做,我会更新我的答案
    • 对不起,我没有提到......是的,请更新答案,因为我只是试图实现这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2011-11-04
    • 2013-07-28
    • 2014-03-05
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多