2010-04-09 11 views
7

Sto migrando un sito web da Rails 2 (più recente) a Rails 3 (beta2).
Test con Rubino 1.9.1p378 e Rubino 1.9.2dev (2010-04-05 tronco 27225)Rails 3 - yield return o callback non chiamerà in vista <% = yield (: sidebar) || render ('shared/sidebar')%>

Bloccato in una situazione, non so quale parte funziona bene. Il sospetto yield è il problema, ma non lo so esattamente.

Nel mio file di layout Io uso la seguente tecnica abbastanza spesso:

app/views/layouts/application.html.erb:

<%= yield(:sidebar) || render('shared/sidebar') %> 

Ad esempio l'aspetto parziale come:

app/views/shared/_sidebar.html.erb:

<p>Default sidebar Content. Bla Bla</p> 

ora è il momento per la parte fondamentale!
In qualsiasi vista, desidero creare un blocco content_for (facoltativo). Questo può contenere un esempio di HTML ecc. Di seguito. Se questo blocco è impostato, il codice HTML all'interno deve essere visualizzato in application.html.erb.
In caso contrario, Rails dovrebbe rendere il parziale a shared/_sidebar.html.erb sul lato destro.

app/views/books/index.html.erb:

<% content_for :sidebar do %> 
    <strong>You have to read REWORK, a book from 37signals!</strong> 
<% end %> 

Così hai l'idea. Fiduciosamente. Questa tecnica ha funzionato bene in qualsiasi applicazione Rails 2.x.
Ora, in Rails 3(beta2) solo la parte yield funziona.

|| render('shared/sidebar') 

Il lato or non elaborerà dalle rotaie o forse rubino.

Grazie per l'input e il tempo!

risposta

7

Ryan Bates da railscast.com mostra in Episodio #227 - Upgrading to Rails 3 Part 3 una soluzione con content_for?() (la riproduzione di video a 2:45 min)

penso, questo è il modo in cui dovremmo usarlo:

content_for?(:sidebar) ? yield(:sidebar) : render("shared/sidebar") 
+1

Questo è così sporco –

3

L'ho provato e sembra che Rails 3 stia restituendo una stringa vuota invece di zero. Quindi, a meno che non lo cambino prima del rilascio finale, dovrai modificare il tuo codice per vedere se il valore è vuoto invece di zero.

(sidebar = yield(:sidebar)).present? ? sidebar : render("shared/sidebar") 
3

Io di solito impostato il mio titolo sito con:

<title><%= ['My Site', yield(:title)].compact.join(' - ') %></title> 

a causa di questo cambiamento, sarebbe brutto per aggiungere alcune condizioni, così ho creato un aiuto come questo:

module ApplicationHelper 
    def nil_empty(str) 
     str.blank? ? nil : str 
    end 
end 

Allora posso fare qualcosa di simile:

<title><%= ['My Site', nil_empty(yield :title)].compact.join(' - ') %></title> 

E 'ancora brutto, ma un po' meno :)

Problemi correlati