2008-10-11 8 views
84

Je veux faire un rendu conditionnel au niveau de la mise en page basé sur le modèle réel a défini content_for(:an__area), une idée de comment faire cela?Rails vérifier si le rendement: zone est définie dans content_for

+0

Voir ma [réponse] (http://stackoverflow.com/questions/3347322/yield-if-content-render-something-otherwise-rails-3/7409626 # 7409626) pour créer une méthode d'aide pour encapsuler ce comportement dans Rails 3. – tristanm

Répondre

193

@content_for_whatever est dépréciée. Utilisez content_for? à la place, comme ceci:

<% if content_for?(:whatever) %> 
    <div><%= yield(:whatever) %></div> 
<% end %> 
+16

L'aide 'content_for?' N'existe que dans Rails 3. Dans Rails 2 vous pouvez utiliser la variable d'instance '@content_for _...' . – lest

+0

Excellent! J'ai écrit des solutions de rechange pour cela trop longtemps. Plus maintenant. – morganjlopes

+2

travaille également dans les rails 4. great thx – daniel

1

Ok Je vais faire une réponse sans honte car personne n'a répondu et j'ai déjà trouvé la réponse :) Définir cela comme une méthode d'aide soit dans application_helper.rb ou partout où vous avez trouvé pratique.

def content_defined?(symbol) 
    content_var_name="@content_for_" + 
     if symbol.kind_of? Symbol 
     symbol.to_s 
     elsif symbol.kind_of? String 
     symbol 
     else 
     raise "Parameter symbol must be string or symbol" 
     end 

    !instance_variable_get(content_var_name).nil? 

    end 
+0

Eh bien, j'aime bien votre auto-réponse mais ... Point mineur, 'instance_variable_defined? (Nom_var_de_contenu)' est un peu plus net que de tester si c'est nul. Deuxième point plus important, la variable content_for instance est obsolète, donc votre solution n'est pas à l'épreuve du temps –

2

peut créer une aide:

def content_defined?(var) 
    content_var_name="@content_for_#{var}"  
    !instance_variable_get(content_var_name).nil? 
end 

Et utiliser dans votre mise en page:

<% if content_defined?(:an__area) %> 
    <h1>An area is defined: <%= yield :an__area %></h1> 
<% end %> 
+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. – eirikir

+0

Je suis d'accord @eirikir, je ne suis pas sûr de ce que mon moi de 6 ans pensait. Je prolonge et laisse ma réponse dedans pour ceux toujours sur Rails 2 .. sans le préambule inutile;) – Nick

10

pas vraiment nécessaire de créer une méthode d'assistance:

<% if @content_for_sidebar %> 
    <div id="sidebar"> 
    <%= yield :sidebar %> 
    </div> 
<% end %> 

puis bien sûr à votre avis:

<% content_for :sidebar do %> 
    ... 
<% end %> 

J'utilise tout le temps d'aller conditionnellement entre une colonne et deux la présentation des colonnes

1

Je ne suis pas sûr des conséquences sur les performances de l'appel rendement deux fois, mais cela va faire quelle que soit la interne la mise en œuvre du rendement (@content_for_xyz est dépréciée) et sans code supplémentaire ou méthodes auxiliaires:

<% if yield :sidebar %> 
    <div id="sidebar"> 
    <%= yield :sidebar %> 
    </div> 
<% end %> 
2
<%if content_for?(:content)%> 
    <%= yield(:content) %> 
<%end%> 
Questions connexes