2011-08-16 14 views
6

mio controller è dotato di questo:rotaie 3 caching: scade azione per percorso di nome

caches_action :render_ticker_for_channel, :expires_in => 30.seconds 

Nei miei percorsi di file ho questo:

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

Nel file di registro vedo questo:

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

Come faccio a scadere manualmente? Ho bisogno di espirarlo da un controller diverso dal controller di rendering, ma anche all'interno del controller di rendering non riesco a farlo scadere la cosa giusta.

Se lo faccio:

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

vedo:

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

Se lo faccio:

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

vedo:

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

Questo:

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

produce:

Expire fragment views/render_c_t/63 (3.5ms) 

Come posso ottenere che scada lo stesso percorso che 'caches_action' sta producendo ?!

+0

Non sono abbastanza sicuro di aggiungere questo come una risposta a pieno titolo, ma hai provato la porta sul retro? 'Rails.application.routes.url_helpers' ti darà accesso ai tuoi helper e restituirà una stringa che è il percorso e/o l'url che verrebbero inviati al browser in un'intestazione Location. Prova 'Rails.application.routes.url_helpers.render_ticker_for_channel_path (63)' e 'Rails.application.routes.url_helpers.render_ticker_for_channel (63,: host => 'mcr3.dev ') 'Potresti essere in grado di passare la stringa risultante (con qualche manipolazione) a' expire_action' e fargli trovare il giusto pezzo in cache. Brutta, ma potrebbe funzionare –

risposta

0

Ci dovrebbe essere sicuramente un "Rails Way" più per fare questo, ma questo potrebbe funzionare come una porta sul retro: Rails.application.routes.url_helpers ti darà accesso ai tuoi aiutanti e ognuno restituirà una stringa che è il percorso e/o l'url che sarebbe essere inviato al browser in un'intestazione di posizione.

Prova Rails.application.routes.url_helpers.render_ticker_for_channel_path(63) che dovrebbe tornare /render_c_t/63 e Rails.application.routes.url_helpers.render_ticker_for_channel(63, :host => 'mcr3.dev') che dovrebbe tornare http://mcr3.dev/render_c_t/63

Con qualche manipolazione è possibile analizzare oltre che seconda corda per tornare al nome che Rails sta usando per l'azione cache:

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

Non è la soluzione più bella, ma dovrebbe funzionare!

5

utilizzare la versione regex di expire_fragment:

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

se hai cache su ** file_store **, questo è il modo migliore per scadere con RegEx – Anatoly

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

Ma per questa soluzione per lavorare abbiamo bisogno di passare un parametro aggiuntivo tramite stringa di query o inviati corpo.