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 comment faire cela?
@content_for_whatever
est obsolète. Utilisation content_for?
à la place, comme ceci:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
pas vraiment nécessaire pour créer une méthode d'aide:
<% if @content_for_sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
puis bien sûr selon vous:
<% content_for :sidebar do %>
...
<% end %>
Je l'utilise tout le temps pour passer conditionnellement entre une disposition à une colonne et deux colonnes
Peut créer un assistant:
def content_defined?(var)
content_var_name="@content_for_#{var}"
!instance_variable_get(content_var_name).nil?
end
Et utilisez ceci dans votre mise en page:
<% if content_defined?(:an__area) %>
<h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
<%if content_for?(:content)%>
<%= yield(:content) %>
<%end%>
Ok, je vais faire une réponse sans vergogne car personne n'a répondu et j'ai déjà trouvé la réponse :) Définissez 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
Je ne suis pas sûr des implications en termes de performances de l'appel de yield deux fois, mais cela se fera indépendamment de l'implémentation interne de yield (@content_for_xyz est déconseillé) et sans aucun code supplémentaire ou méthodes d'assistance:
<% if yield :sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>