2010-11-07 15 views
5

La breve domanda è: come può di una sottopaginaIn che modo Ruby on Rails "content_for: title" ottiene qualcosa che viene assegnato in seguito?

<% content_for :title do 'Showing product' end %> 

impostare il :title per il layout principale?


dettagli:

Possiamo usare nel layout dell'applicazione application.html.erb

<title><%= content_for :title %> 
    ... 
    <%= yield %> 

e penso yield restituisce il contenuto di una pagina secondaria, ad esempio da show.html.erb, dove si contiene:

<% content_for :title do 'Showing product' end %> 

Come può il :title in qualche modo si abitua a qualcosa sopra lo yield? Ho pensato che la parte title sia stata valutata per prima, e quindi la yield, quindi come può il :title impostare retroattivamente il contenuto per il tag <title>?

risposta

8

Risposta breve: barando.

Risposta lunga: ActionView ridefinisce la resa in modo che non sia la stessa resa che conosciamo e amiamo del buon vecchio rubino. In effetti, il file modello viene eseguito prima del file di layout e quindi il rendimento nel file di layout verrà sostituito dal modello già visualizzato. I blocchi content_for vengono salvati in variabili di classe e quindi è possibile accedervi in ​​seguito dal proprio layout.

5

ho definito un metodo di supporto title nel mio file application_helper.rb in questo modo:

module ApplicationHelper 
    def title(page_title) 
    content_for(:title){ page_title } 
    page_title 
    end 
end 

Poi nella parte superiore dei miei contenuti file ERB posso fare questo

<% title "Rails Rocks" %> 
Other regular content 

E nel application.html.erb

<html> 
<head> 
    <% title = yield(:title).chop! %> 
    <title><%= title || 'Default Title' %></title> 
</head> 
<body> 
    <h1 class="title"><%= title %></h1> 
</body> 
+0

Perché hai inserito un #chop! Là? – maikovich