根据模型实例设置每个请求Time.zone并保持DRY

时间:2014-08-31 16:51:23

标签: ruby-on-rails timezone

我有以下代码:

around_filter :event_time_zone

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

我把它放在我的ApplicationController中。

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

有没有一种简单的方法可以使用上面的代码而不是在任何地方重复自己?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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