【问题标题】:Setting per request Time.zone based on a model instance and keeping DRY基于模型实例设置每个请求 Time.zone 并保持 DRY
【发布时间】:2014-08-31 16:51:23
【问题描述】:

我有以下代码:

around_filter :event_time_zone

def event_time_zone(&block)
  @event.present? ? Time.use_zone(@event.venue.time_zone_name, &block) : yield
end

我把它放在我的 ApplicationController 中。

问题是实例变量@event 在调用此 around_filter 时从未设置。然而,它在每个资源控制器中的操作之前可用(通过使用 CanCan),但是我不想在所有这些控制器中撒上一堆 around_filter 调用。

有没有一种简单的方法可以让我使用上面的代码,但又不会到处重复自己?

我可以创建基于用户的 time_zone,但如果用户在不同时区管理事件怎么办?唯一要显示的相关日期只能在事件时区中。

【问题讨论】:

    标签: ruby-on-rails timezone


    【解决方案1】:

    我认为您的问题与过滤器触发的顺序有关,即 around_filter 在设置 @event 变量的过滤器之前运行

    我个人会根据需要为每个控制器执行此操作,您的应用程序最终将有许多与事件无关的控制器/动作。

    • 设置在应用程序控制器中处理的基于用户的时区设置/处理
    • 根据需要根据@event 设置时区以覆盖用户设置

    您可能对我在 Rails 时区上发表的这篇博文感兴趣(另请参阅 github 上的示例代码)-http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/

    【讨论】:

    • 关于解雇令你是对的。感谢您的博客文章,我认为这是我需要弄清楚的所有信息。我已经让一切正常工作,只是厌倦了所有的 in_time_zone 到处都是。通过模型和控制器级别的一些方便方法,我可以摆脱大部分 TZ 代码。谢谢!
    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多