Quindi ho provato diversi approcci diversi, per vedere cosa funziona e cosa no.
Anche in questo caso, per riassumere la situazione: Il mio obiettivo è quello di scadere pagine memorizzate nella cache quando un oggetto gli aggiornamenti, ma per scadere loro senza fare affidamento su un'azione di controllo. Le spazzatrici convenzionali usano una linea nel controller per notificare alla spazzatrice che deve funzionare. In questo caso, non posso usare una linea nel controller, poiché l'aggiornamento sta avvenendo all'interno del modello. Le normali esercitazioni di sweeper non funzionano, poiché presumono che l'interazione principale con l'oggetto del database avvenga tramite il controller.
Se, leggendo questo, si vede un modo per stringere il mio codice, si prega di commentare e fammi sapere.
In primo luogo, diamo un'occhiata alle cose che funzionano, nel caso in cui anche tu sia bloccato su questo, e hai bisogno di aiuto.
Di tutte le cose che ho provato, l'unica cosa che davvero sembrava funzionare era dichiarare un comando after_update nell'Observer per il modello. In quel comando, ho usato il comando esplicito per l'azione expire_page e incluso un percorso che era stato dichiarato in routes.rb.
Così. Questo funziona:
in config/routes.rb:
map.link 'l/:md5.:format', :controller => 'links', :action => 'show'
in app/modelli/link_observer.rb:
def after_update(link)
ActionController::Base.expire_page(app.link_path(:md5 => link.md5))
end
Si noti che che "MD5" è specifico per la mia app. Potresti voler usare: id o qualche altro identificatore univoco.
Ho anche trovato che dichiara che la linea ActionController :: Base ... dal metodo nel modello che sta facendo l'aggiornamento ha funzionato. Cioè, all'interno di Link.rb, nel metodo che sta effettivamente aggiornando il database, se ho appena bloccato l'intera riga, ha funzionato. Ma dato che potrei voler far scadere la cache della pagina su altri metodi in futuro, preferirei che fosse estratta nell'Observer.
Ora, diamo un'occhiata ad alcune cose che NON FUNZIONANO, nel caso tu stia cercando su Google per questo.
Calling "expire_page (...)" all'interno del metodo after_update (link) all'interno di link_observer.rb non ha funzionato, in quanto ha restituito un "metodo non definito` expire_page '" errore
Creazione di una spazzatrice il file che osservava che il Modello non funzionava. Non sono riuscito a trovare alcun codice di errore, ma sembrava non essere nemmeno consapevole del fatto che aveva un lavoro da fare. Questo era dopo aver chiamato esplicitamente "config.load_paths + =% W (# {RAILS_ROOT}/app/sweepers)" in environment.rb. Solo nel caso in cui qualcosa di grasso dalle dita in quel codice, qui è:
class LinkSweeper < ActionController::Caching::Sweeper
observe Link
def after_update(link)
clear_links_cache(link)
end
def clear_links_cache(link)
# DID NOT WORK expire_page :controller => 'links', :action => 'show', :md5 => link.md5
# DID NOT WORK expire_page '/l/'+ link.md5 + '.html'
# DID NOT WORK ActionController::Base.expire_page(app.link_path(:md5 => link.md5))
end
end
che al di sopra esempio aveva il file link_sweeper.rb in una directory,/app/spazzatrici. Ho anche provato a mettere link_sweeper.rb all'interno della directory app/modelli, e provato a chiamare con il comando config.active_record.observers in environment.rb:
config.active_record.observers = :link_observer, :link_sweeper
Ma che non ha funzionato, neanche.
Quindi, sì. È abbastanza probabile che uno di questi metodi funzioni e che abbia incasinato qualcosa nel codice. Ma penso di aver fatto tutto dal libro.
In definitiva, per riassumere: Anziché utilizzare una Sweeper per far scadere il caching delle pagine, si desidera impostare un after_ callback nell'Observer del modello. Ti consigliamo di utilizzare il percorso esplicito al metodo Base.expire_page:
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
Speriamo che questo vi aiuterà a qualcun altro lungo la strada. Di nuovo, se vedi qualcosa nel mio codice non funzionante dove avrei dovuto fare qualcosa di diverso, per favore fammi sapere. Se vedi qualcosa nel mio codice di lavoro che può essere più stretto, ti prego di farmelo sapere anch'io.
Ho appena trovato questo post che copre l'argomento con dovizia di particolari: [Rails 3.1 caching: action_caching e cache spazzatrici] (http://tech.thereq.com/post/13375604886/rails-3-1-caching -action-caching-and-cache-sweepers? 1e2bdcc0 # disqus_thread) – dgilperez