Schienen prüfen, ob Yield: Area in content_for definiert ist

97

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?

William Yeung
quelle
Siehe meine Antwort zum Erstellen einer
Hilfsmethode

Antworten:

217

@content_for_whateverist veraltet. Verwenden Sie content_for?stattdessen wie folgt:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
gudleik
quelle
16
Der Helper content_for?ist nur in Rails 3 vorhanden. In Rails 2 können Sie eine @content_for_...Instanzvariable verwenden.
damit
10

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

efalcao
quelle
2
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
gregwinn
quelle
2

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 %>
Nick
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Eirikir
Ich stimme @eirikir zu, nicht sicher, was mein 6 Jahre jüngeres Ich dachte. Ich erweitere und lasse meine Antwort für diejenigen, die noch auf Rails 2 sind .. ohne die unnötige Präambel;)
Nick
1

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
William Yeung
quelle
Heh gut, ich mag deine Selbstantwort, aber ... 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
Dave Nolan
1

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 %>
Enrico
quelle