2010-04-09 15 views
7

Je migre un site Web de Rails 2 (plus récent) vers Rails 3 (beta2).
Test avec Ruby 1.9.1p378 et Ruby 1.9.2dev (2010-04-05 tronc 27225)Rails 3 - le retour de rendement ou le rappel ne sera pas appelé <% = yield (: sidebar) || render ('shared/sidebar')%>

Coincé dans une situation, je ne sais pas quelle partie va bien travailler. Suspect yield est le problème, mais ne sais pas exactement.

Dans ma mise en page Fichiers j'utiliser la technique suivante assez souvent:

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

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

Pour exemple l'aspect partiel comme:

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

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

Maintenant, il est temps pour la partie clé!
Dans n'importe quelle vue, je souhaite créer un bloc content_for (facultatif). Cela peut contenir une pièce de HTML, etc. exemple ci-dessous. Si ce bloc est défini, le code HTML à l'intérieur doit apparaître dans application.html.erb.
Si ce n'est pas le cas, Rails doit rendre le partiel à shared/_sidebar.html.erb sur le côté droit.

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

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

Vous avez l'idée. Espérons. Cette technique a bien fonctionné dans n'importe quelle application Rails 2.x.
Maintenant, dans Rails 3(beta2) seule la partie yield fonctionne.

|| render('shared/sidebar') 

Le côté or ne traitera pas par des rails ou peut-être rubis.

Merci pour la saisie et le temps!

Répondre

7

Ryan Bates à partir de rails.com montre dans l'épisode #227 - Upgrading to Rails 3 Part 3 une solution avec content_for?() (lecture vidéo à 2:45 min)

Je pense, c'est la façon dont nous devrions l'utiliser:

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

Ceci est tellement sale –

3

J'ai testé cela et il semble que Rails 3 renvoie la chaîne vide au lieu de zéro. Donc, à moins qu'ils ne modifient cela avant la version finale, vous devrez modifier votre code pour voir si la valeur est vide au lieu de rien.

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

Je mis habituellement mon titre de site avec:

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

en raison de ce changement, il serait laid d'ajouter des conditions, donc je créé une aide comme ceci:

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

Ensuite, je peux faire quelque chose comme:

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

Il est toujours laid, mais un peu moins :)