2010-07-24 12 views

risposta

4

Penso che dovrebbe essere in centro, ma per ora è possibile effettuare un metodo di supporto:

def current_layout 
    controller.send :_layout 
    end 

tornerà attualmente utilizzata nome del layout

+3

Questo è vero nel caso in cui non si esegue il rendering manualmente un layout simile a questo: rendere: layout => 'applicazione'. – xpepermint

0

Si può fare quello che ho fatto nella mia Ajax gem for Rails che è quello di avvolgere il metodo _render_layout:

ActionView::Base.class_eval do 
     def _render_layout_with_tracking(layout, locals, &block) 
     controller.instance_variable_set(:@_rendered_layout, layout) 
     _render_layout_without_tracking(layout, locals, &block) 
     end 
     alias_method_chain :_render_layout, :tracking 
    end 

Quindi è possibile accedere al valore che è stato impostato dalla visualizzazione (sono abbastanza sicuro di avere accesso al controll er là ...) o nel controller in un after_filter, che è quello che faccio.

Ho scritto un custom RSpec 2 matcher che può essere usato per testare il rendering layout in Rails 3.

5

Per Rails 4:

controller.send(:_layout) 
=> 'application'  

Per Rails 3.2:

controller.send(:_layout) 
=> #<ActionView::Template:0x000000082bb788> 

Ma controller.send(:_layout).identifier restituisce il percorso completo:

/home/davidm/Documentos/Devel/myapp/app/views/layouts/application.haml 
17

Ottenere questo funzionamento in Rails 3.2 è un po 'più complicato di quanto descritto in precedenza. Se il controller dichiara esplicitamente un layout, il risultato di controller.send(:_layout) è una stringa, ma in caso contrario è un modello ActionView ::. Prova questo:

module ApplicationHelper 
    def current_layout 
    layout = controller.send(:_layout) 
    if layout.instance_of? String 
     layout 
    else 
     File.basename(layout.identifier).split('.').first 
    end 
    end 
end 
+0

Questo è sbagliato - ottiene ciò che il controller imposta, ma non un set con 'rendering: layout'. –

2

Ho usato in Rails4 alle pagine di visualizzazione e ho ricevuto.

controller.send(:_layout) 

Spero che questo aiuto. enter image description here

2

in rotaie 5

che funziona con me

def current_layout 
    layout = controller.class.send(:_layout) 
    if layout.nil? 
    default_layout 
    elsif layout.instance_of? String or layout.instance_of? Symbol 
    layout 
    else 
    File.basename(layout.identifier).split('.').first 
    end 
end 
+0

L'OP ha chiesto una versione diversa da quella che viene mostrata qui. Sei sicuro che saranno comparabili visto che apparentemente andare da 2 a 3 non lo è. – Mike

Problemi correlati