2011-08-16 30 views
6

我的控制器有這樣的:軌道3緩存:過期行動命名的路由

caches_action :render_ticker_for_channel, :expires_in => 30.seconds 

在我的路線文件我有這樣的:

match '/render_c_t/:channel_id' => 'render#render_ticker_for_channel', :as => :render_channel_ticker 

在日誌文件中我看到這一點:

Write fragment views/mcr3.dev/render_c_t/63 (11.6ms) 

如何手動過期?我需要從渲染控制器不同的控制器中過期,但即使在渲染控制器中,我也無法讓它過期。

如果我做的:

expire_action(:controller => 'render', :action => 'render_ticker_for_channel', :id => c.id) 

我看到:

Expire fragment views/mcr3.dev/render/render_ticker_for_channel/63 (3.2ms) 

如果我做的:

expire_action(:controller => 'render', :action => 'render_c_t', :id => c.id) 

我看到:

Expire fragment views/mcr3.dev/render/render_c_t/63 (3.2ms) 

這樣:

expire_action("render_c_t/#{c.id}") 

生產:

Expire fragment views/render_c_t/63 (3.5ms) 

我怎樣才能得到它過期那caches_action'是生產相同的路徑?

+0

我沒有足夠的信心將此添加爲完整的答案,但是您是否試過了後門? 'Rails.application.routes.url_helpers'可以讓你訪問你的幫助器,並返回一個字符串,這個字符串就是在Location標題中發送給瀏覽器的路徑和/或URL。試試'Rails.application.routes.url_helpers.render_ticker_for_channel_path(63)'和'Rails.application.routes.url_helpers.render_ticker_for_channel(63,:host =>'mcr3。dev')'你可能能夠將結果字符串(通過一些操作)傳遞給'expire_action'並讓它找到正確的緩存塊。醜陋的,但可能工作 –

回答

0

確實應該有更多的「Rails方式」來做到這一點,但這可能會作爲後門工作:Rails.application.routes.url_helpers會讓你訪問你的助手,每個將返回一個字符串,這是一個路徑和/或URL被髮送到位置標題中的瀏覽器。

嘗試Rails.application.routes.url_helpers.render_ticker_for_channel_path(63)應返回/render_c_t/63Rails.application.routes.url_helpers.render_ticker_for_channel(63, :host => 'mcr3.dev')應返回http://mcr3.dev/render_c_t/63

對於某些操作,你可以解析開即第二個字符串,回到Rails所使用的緩存的動作名稱:

def funky_action_cache_name(route, params) 
    Rails.application.routes.url_helpers.send(route.to_s+'_url', params).gsub(/https?:\/\//,'') 
end 

# expire_action(funky_action_cache_name(:render_ticker_for_channel, :id => 63)) 

不是最美麗的解決方案,但應該工作!

5

使用的expire_fragment正則表達式版本:

expire_fragment %r{render_c_t/#{c.id}/} 
+0

如果你有** file_store **上的緩存,這是RegEx過期的最佳方式 – Anatoly

-1
caches_action :render_ticker_for_channel, :if => proc do 
    !!params['doCache'] 
end 

但對於這個解決方案的工作,我們需要通過額外的PARAM無論是通過查詢字符串或交的身體。