2014-04-01 12 views
7

Ho trovato numerose risorse per Rails 3, ma nessuno per Rails 4:Rails 4 - Nome del layout corrente?


Nel tentativo di mantenere le cose SECCO, abbiamo un metodo che definisce alcune meta-tag. Mi piacerebbe includere il layout del title param:

Solo
#app/controllers/application_controller.rb 
    before_action :set_meta_tags 

    def set_meta_tags 
    title = (layout != "application") ? "#{layout} ::" : false 
    set_meta title: "#{layout} #{setting(:site, :title)}", description: setting(:site, :description) 
    end 

problema è che non so come restituire il layout corrente in Rails 4 - qualsiasi aiuto sarà molto apprezzato!

risposta

7

In Rails 5, il codice è:

controller.send :_layout, ["some_string_here"] 

Non so il motivo per cui ha bisogno di una stringa nella matrice, ma questo è quello ottenuto lavorando per me. Il nostro file di supporto è il seguente:

def current_layout 
    layout = controller.send :_layout, ["test"] 
    return layout.inspect.split("/").last.gsub(/.haml/,"") 
end 
5

È possibile aggiungere il seguente in ApplicationHelper:

def current_layout 
    (controller.send :_layout).inspect.split("/").last.gsub(/.html.erb/,"") 
end 

e si può chiamare di conseguenza in set_meta_tags metodo. Qualcosa di simile,

def set_meta_tags 
    title = (current_layout != "application") ? "#{current_layout} ::" : false 
    set_meta title: "#{layout} #{setting(:site, :title)}", description: setting(:site, :description) 
    end 

NOTA:

.inspect mi dà il nome del layout con il suo percorso relativo.

.split("/").last rimuoverà il percorso relativo e restituirà solo il nome del layout (con estensione).

.gsub(/.html.erb/) rimuove la parte di estensione del layout. Potrebbe essere necessario regolare lo extension in base al motore di modello che si sta utilizzando, ad es. In caso di Haml utilizzare .html.haml.


mia soluzione

Da una chiacchierata con Kirti, sembra che il mio dimenticando di menzionare che avevamo impostato manualmente layout era un grosso problema. Ciò funzionerà se si imposta manualmente il layout:

#app/helpers/application_helper.rb 
def current_layout 
    self.send :_layout 
end 

def set_meta_tags 
    title = (current_layout != "application") ? "#{current_layout.titleize} :: " : "" 
    set_meta title: title + setting(:site, :title), description: setting(:site, :description) 
end 
+0

Spasibo! Fammi provare –

+0

In realtà, tieni duro non funziona così bene - fammi fare il debug –