2011-08-16 13 views
6

Moje kontroler ma to:szyny 3 buforowanie: wygasają skargi o nazwie trasy

caches_action :render_ticker_for_channel, :expires_in => 30.seconds 

W moich trasach plik mam to:

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

W pliku dziennika widzę to:

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

Jak wygasić to ręcznie? Muszę wygasić to z innego kontrolera niż kontroler renderowania, ale nawet w kontrolerze renderowania nie mogę go wydać, aby wygasło właściwe.

Jeśli zrobić:

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

widzę:

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

Jeśli zrobić:

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

widzę:

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

To:

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

produkuje:

Expire fragment views/render_c_t/63 (3.5ms) 

Jak mogę to wygaśnie tą samą drogą, że 'caches_action' jest produkujących ?!

+0

Nie jestem wystarczająco pewny, aby dodać to jako pełną odpowiedź, ale czy próbowałeś tylnych drzwi? 'Rails.application.routes.url_helpers' daje dostęp do twoich pomocników i zwraca ciąg znaków, który jest ścieżką i/lub adresem URL, który zostanie wysłany do przeglądarki w nagłówku Location. Wypróbuj 'Rails.application.routes.url_helpers.render_ticker_for_channel_path (63)' oraz 'Rails.application.routes.url_helpers.render_ticker_for_channel (63,: host => 'mcr3.dev ') 'Być może będziesz w stanie przekazać wynikowy ciąg (z pewną manipulacją) do' expire_action' i sprawić, że znajdzie właściwy fragment w pamięci podręcznej. Brzydki, ale może działać –

Odpowiedz

0

Z pewnością powinno być więcej "Rails Way", aby to zrobić, ale może to działać jako tylne drzwi: Rails.application.routes.url_helpers da ci dostęp do twoich pomocników, a każdy zwróci ciąg będący ścieżką i/lub adresem URL, który być wysłane do przeglądarki w nagłówku Lokalizacja.

Spróbuj Rails.application.routes.url_helpers.render_ticker_for_channel_path(63) które powinny powrócić /render_c_t/63 i Rails.application.routes.url_helpers.render_ticker_for_channel(63, :host => 'mcr3.dev') które powinny powrócić http://mcr3.dev/render_c_t/63

Z pewną manipulacją można analizować siebie, że drugi ciąg wrócić do nazwy, która Rails korzysta z pamięci podręcznej działania:

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)) 

Nie najpiękniejsze rozwiązanie, ale powinno działać!

5

Użyj wersji regex z expire_fragment:

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

, jeśli masz pamięć podręczną w ** file_store **, jest to najlepszy sposób na wygasanie z RegEx – Anatoly

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

Ale dla tego rozwiązania do pracy musimy zdać dodatkowy param za pośrednictwem łańcucha zapytania lub po organizmie.