2014-08-31 39 views
2

我有以下代碼:設置基於模型實例,並保持乾燥

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

我覺得你的問題是與該過濾器發射,即around_filter的過濾器,然後運行設置@event變量

我個人根據需要會做這樣每個控制器,你的應用程序的順序做最終會有許多與事件無關的控制器/操作。

  • 設置基於用戶的時區設置/處理,這是在應用控制器
  • 設置基於@event需要重寫用戶設置

你可能有興趣在這個博客帖子我的時區處理做軌道時區(也見github上的示例代碼) - http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/

+1

你是正確的射擊順序。感謝那篇博客文章,我認爲這是我需要了解的所有信息。我已經有了一切正常的工作,只是對所有in_time_zone的垃圾無處不在。通過模型和控制器級別的一些便利方法,我可以擺脫大部分TZ代碼。謝謝! – JBlake 2014-08-31 17:26:40