2015-01-19 5 views
11

Ho due partial che si riferiscono l'un l'altro. Quando ho calcolare le dipendenze nidificate nella console piace così (con un po 'Emissione codice di debug quale modello viene caricata):Perché i miei modelli autoreferenziali interrompono il calcolo del digest della cache nella console e il rake ma non nel server?

finder = ApplicationController.new.lookup_context 
ActionView::Digestor.new(name: "posts/show", finder: finder).nested_dependencies 

o tramite il task rake in questo modo:

rake cache_digests:nested_dependencies TEMPLATE=posts/show 

ottengo un breve elenco delle dipendenze iniziali, e poi questo in un ciclo infinito, fino a quando la pila rubino è pieno:

... 
>>>>>>> users/foo 
>>>>>>> users/bar 
>>>>>>> users/baz 
>>>>>>> users/bip 
>>>>>>> users/foo 
>>>>>>> users/bar 
>>>>>>> users/baz 
>>>>>>> users/bip 
SystemStackError: stack level too deep 

(nomi dei modelli modificati)

Tuttavia, quando eseguo il server delle app e richiedo il modello, le cose funzionano alla perfezione, nessun loop infinito.

Qui ci sono le mie impostazioni in tutti i casi di cui sopra:

config.action_controller.perform_caching = true 
config.cache_store = :file_store, Rails.root.to_s + '/tmp/cache/stuff' 
ActionView::Base.cache_template_loading = true 

Il codice indica che esso ha la protezione di riferimento ricorsivo: https://github.com/rails/rails/blob/v4.1.8/actionview/lib/action_view/digestor.rb#L35

Perché questa protezione lavorando in ambiente server, ma non in console o il compito rake?

(anche un problema github https://github.com/rails/rails/issues/18667)

+0

Rails e l'attività rake utilizzano due metodi completamente diversi. Rails chiama 'ActionView :: Digestor.digest' che chiama in' compute_and_store_digest' che ha la protezione del ciclo inifite. Tuttavia 'nested_dependencies' chiama solo 'DependencyTracker.find_dependencies' in modo ricorsivo senza alcun rilevamento di loop infinito. Se controlli l'utilizzo di 'nested_dependencies' su github puoi vedere che è usato solo dal rake task e da nessun'altra parte. Quindi IMHO questo è un bug in 'nested_dependencies'. – nemesv

+0

grazie ... perché questo è un commento? –

risposta

1

Rotaie e il task rake utilizza due metodi completamente diversi del ActionView::Digestor.

  • rotaie generalmente chiamate ActionView::Digestor.digest che chiama in compute_and_store_digest che ha la protezione ciclo infinito.

  • Tuttavia, nested_dependencies chiama solo DependencyTracker.find _dipendenze in modo ricorsivo senza rilevamento di loop infinito.

Se check for usages di nested_dependencies su GitHub si può vedere che è utilizzato solo dal compito rastrello e in nessun altro luogo.

Quindi IMHO questo è un errore in nested_dependencies.

Problemi correlati