2010-11-07 8 views
5

Krótkie pytanie brzmi: w jaki sposób można podstrona naW jaki sposób Ruby on Rails "content_for: title" może uzyskać coś, co zostanie przypisane później?

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

ustawić :title dla głównego układu?


szczegóły:

Możemy użyć w układzie aplikacji application.html.erb

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

i myślę yield Zwraca zawartość do podstrony, takie jak z show.html.erb, gdzie zawiera:

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

Jak można :title jakoś się przyzwyczaić przez coś ponad yield? Myślałem, że część title jest obliczana jako pierwsza, a następnie yield, więc w jaki sposób :title może z mocą wsteczną ustawić zawartość dla znacznika <title>?

Odpowiedz

8

Krótka odpowiedź: przez oszustwo.

Długa odpowiedź: ActionView na nowo definiuje plon, więc nie jest to ten sam plon, który znamy i kochamy z dobrego rubinu. W rzeczywistości plik szablonu jest renderowany przed plikiem układu, a wtedy wydajność w pliku układu zostanie zastąpiona przez już renderowany szablon. content_for bloki są zapisywane w zmiennych klasowych, dzięki czemu można później uzyskać do nich dostęp ze swojego układu.

5

I zdefiniowano metodę pomocnika title w moim pliku application_helper.rb tak:

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

potem na szczycie moich zawartości plików ERB mogę zrobić

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

A w application.html.erb

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

Dlaczego umieściłeś #chop! tam? – maikovich