2012-02-28 26 views
3

我有一個離線rake作業來更新我的模型。發生這種情況時,我希望過期該模型的show操作。expire_action from model

# in lib/models/my_model.rb 
after_update :expire_cache 
def expire_cache 
    expire_action :controller => :my_models, :action => :show, :id => self 
end 

這不起作用,因爲expire_action在模型中不可用。調用ActionController.new.expire_action給了我很多奇怪的路由問題,這是合理的,因爲沒有任何路由邏輯連接起來。

我認爲expire_action的常用方法是使用清掃器,但這不起作用,因爲我的模型沒有通過控制器操作更新。

注:我覺得我可能會用錯誤的方式緩存,因爲我無法在任何地方找到答案。

回答

1

您正在查找ActionController Sweeper。你可以找到關於如何實現它們here官方Rails文檔,但是有可能你想是這樣的:

class MyModelSweeper < ActionController::Caching::Sweeper 
    observe MyModel 

    def after_update(my_model) 
    expire_action :controller => :my_models, :action => :show, :id => my_model 
    end 

end 
+0

我的理解是掃地機鉤到一個控制器動作,這是行不通的,因爲該模型是不作爲行動的一部分進行更新。這不正確嗎? – phillee 2012-02-28 19:54:43

+0

清掃器觀察模型,但也被掛鉤到控制器中(例如,允許您過期頁面)。通過執行'''觀察MyModel''',掃除器將監視模型上的變化,然後可以基於這些變化使頁面失效,所有這些都在響應堆棧外。 – Veraticus 2012-02-28 20:04:53

+0

因此,如果rails服務器正在運行,它將檢測由單獨的離線rake任務完成的模型更改? – phillee 2012-02-29 00:10:56