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)
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
grazie ... perché questo è un commento? –