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
Répondre
@content_for_whatever
est dépréciée. Utilisez content_for?
à la place, comme ceci:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
L'aide 'content_for?' N'existe que dans Rails 3. Dans Rails 2 vous pouvez utiliser la variable d'instance '@content_for _...' . – lest
Excellent! J'ai écrit des solutions de rechange pour cela trop longtemps. Plus maintenant. – morganjlopes
travaille également dans les rails 4. great thx – daniel
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
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 –
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 %>
Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. – eirikir
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
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
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 %>
<%if content_for?(:content)%>
<%= yield(:content) %>
<%end%>
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