Perché i binari rendono i modelli RJS all'interno di un layout?
-
28-10-2019 - |
Domanda
Devo farlo per un controller che utilizza il active_scaffold
gemma. Abbiamo un controller che assomigliava a questo:
class Admin::UsersController < ApplicationController
layout 'admin'
active_scaffold :users do |config|
config.search.columns = [:first_name, :last_name]
end
end
Ha funzionato alla grande quando eravamo su Rails 2.3.10, ma stiamo aggiornando ai Rails 3.0.10. Come parte dell'aggiornamento, ho dovuto aggiornare active_scaffold
(Attualmente installato dal rails-3.0
ramo di git://github.com/activescaffold/active_scaffold
) per essere compatibile. Un problema che stavamo riscontrando è che la ricerca del tavolo non funzionava. Vedrei nei miei file di registro:
Rendered <snip>/gems/active_scaffold-25b3d724f35b/frontends/default/views/list.js.rjs within layouts/admin (923.5ms)
Si noti che sta rendendo il modello RJS con il layout specificato nel controller. Mi sembra un predefinito irragionevole per me. I modelli RJS non dovrebbero rendere i modelli senza un layout Per impostazione predefinita? Comunque, l'ho risolto come tale:
class Admin::UsersController < ApplicationController
layout :admin_layout
private
def admin_layout
respond_to do |format|
format.js { false }
format.html { 'admin' }
end
end
end
Ciò risolve i problemi con la ricerca e la paginazione. (Il modello RJS è ora reso senza un layout, quindi il browser può eseguire JavaScript risultante). Immagino che la mia domanda sia: perché devo dire Rails che non dovrebbe rendere i modelli RJS con layout? E esiste una soluzione migliore? Mi sembra troppo di un hack (il brutto tipo di hack --- il tipo di hack che si romperà in futuro).
Soluzione
Ok, l'ho capito. @numeras1311407 Il commento di cui alla mia domanda mi ha portato a controllare il nome del modello di layout. Era layouts/admin.haml
. Con Rails 2, quel layout stava solo rendendo le richieste HTML, ma con Rails 3 si applica a tutte le richieste (perché non specifica un tipo di formato). L'ho ribattezzato layouts/admin.html.haml
E funziona con un semplice layout 'admin'
Nel mio controller (al contrario dell'hack che avevo inventato nella mia domanda).
Quindi la risposta alla domanda "Perché i binari rendono i modelli RJS all'interno di un layout?" è che il file di layout è stato denominato in modo tale che si applica a tutti i formati.
Altri suggerimenti
Rispondi alle tue quazioni:
1. Non esiste una magia in cui i rendering di rotaie layout per il formato JS. Questo è Bacause, è predefinito per i binari rendere il layout con qualsiasi modello a meno che non si dice esplicitamente per evitarlo. Puoi semplicemente esaminare le fonti di Rails in file: actionpack/lib/action_controller/metal/renderers.rb
Per vedere: JS Renderer.
2.PERTENZE da usare:
respond_to do |format|
format.js { render *your_any_options*, layout: false }
end