2010-04-09 12 views
7

Estoy migrando un sitio web desde Rails 2 (más reciente) a Rails 3 (beta2).
de pruebas con Rubí 1.9.1p378 y Rubí 1.9.2dev (2010-04-05 tronco 27225)Rieles 3: retorno de rendimiento o devolución de llamada no se ejecutarán en vista <% = yield (: sidebar) || render ('shared/sidebar')%>

Atrapado en una situación, no sé qué parte va a funcionar bien. El problema es el sospechoso yield, pero no lo sé exactamente.

En mi archivos de diseño que utilice la siguiente técnica muy a menudo:

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

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

por ejemplo, el aspecto parcial como:

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

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

Ahora es el momento para la pieza clave!
En cualquier vista, quiero crear un bloque content_for (opcional). Esto puede contener un ejemplo de pice de HTML, etc. a continuación. Si se establece este bloque, el pice HTML interno debe mostrarse en application.html.erb.
De lo contrario, los rieles deben mostrar el parcial en shared/_sidebar.html.erb en el lado derecho.

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

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

Así que tienes la idea. Ojalá. Esta técnica funcionó bien en cualquier aplicación de Rails 2.x.
Ahora, en Rails 3(beta2) solo la parte yield está funcionando.

|| render('shared/sidebar') 

El lado or no procesará por raíles o tal vez rubí.

¡Gracias por su tiempo y contribución!

Respuesta

7

Ryan Bates de railscasts.com muestra en el episodio #227 - Upgrading to Rails 3 Part 3 una solución con content_for?() (reproducción de vídeo a las 2:45 Min)

pienso, ese es el camino que debemos usarlo:

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

Esto es tan sucio –

3

Probé esto y parece que Rails 3 está devolviendo una cadena vacía en lugar de cero. Por lo tanto, a menos que cambien esto antes del lanzamiento final, tendrá que modificar su código para ver si el valor está en blanco en lugar de simplemente nulo.

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

que suele fijar mi título sitio con:

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

Debido a este cambio, sería feo para añadir algunas condiciones, por lo que creó un ayudante de la siguiente manera:

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

Entonces puedo hacer algo como:

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

Todavía es feo, pero un poco menos :)

Cuestiones relacionadas