Ich möchte ein bedingtes Rendern auf Layoutebene basierend auf der tatsächlich definierten Vorlage durchführen. Haben Sie content_for(:an__area)
eine Idee, wie dies erreicht werden kann?
Ich möchte ein bedingtes Rendern auf Layoutebene basierend auf der tatsächlich definierten Vorlage durchführen. Haben Sie content_for(:an__area)
eine Idee, wie dies erreicht werden kann?
Antworten:
@content_for_whatever
ist veraltet. Verwenden Sie content_for?
stattdessen wie folgt:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
content_for?
ist nur in Rails 3 vorhanden. In Rails 2 können Sie eine @content_for_...
Instanzvariable verwenden.
nicht wirklich notwendig, um eine Hilfsmethode zu erstellen:
<% if @content_for_sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
dann natürlich aus deiner sicht:
<% content_for :sidebar do %>
...
<% end %>
Ich benutze dies die ganze Zeit, um bedingt zwischen einem einspaltigen und einem zweispaltigen Layout zu wechseln
Kann einen Helfer erstellen:
def content_defined?(var)
content_var_name="@content_for_#{var}"
!instance_variable_get(content_var_name).nil?
end
Und verwenden Sie dies in Ihrem Layout:
<% if content_defined?(:an__area) %>
<h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
Ok, ich werde schamlos eine Selbstantwort machen, da niemand geantwortet hat und ich die Antwort bereits gefunden habe :) Definieren Sie dies als Hilfsmethode entweder in application_helper.rb oder an einer Stelle, die Sie für zweckmäßig befunden haben.
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
instance_variable_defined?(content_var_name)
Kleiner Punkt, ist ein bisschen ordentlicher als anstatt zu testen, ob es null ist. Der zweite größere Punkt, die Variable content_for instance, ist veraltet, sodass Ihre Lösung nicht zukunftssicher ist
Ich bin mir nicht sicher, welche Auswirkungen es hat, wenn Yield zweimal aufgerufen wird. Dies funktioniert jedoch unabhängig von der internen Implementierung von Yield (@content_for_xyz ist veraltet) und ohne zusätzlichen Code oder Hilfsmethoden:
<% if yield :sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>