Les rails vérifient si le rendement: la zone est définie dans content_for

97

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 y parvenir?

William Yeung
la source
Voir ma réponse pour créer une méthode d'aide pour encapsuler ce comportement dans Rails 3.
tristanm

Réponses:

217

@content_for_whateverest obsolète. Utilisez à la content_for?place, comme ceci:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
Gudleik
la source
16
Helper content_for?n'existe que dans Rails 3. Dans Rails 2, vous pouvez utiliser la @content_for_...variable d'instance.
peur
10

pas vraiment nécessaire pour 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 %>

Je l'utilise tout le temps pour passer conditionnellement entre une disposition à une colonne et à deux colonnes

efalcao
la source
2
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
Gregwinn
la source
2

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 %>
pseudo
la source
Cela ne répond pas à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous sa publication.
eirikir
Je suis d'accord @eirikir, je ne sais pas trop à quoi pensait mon jeune moi de 6 ans. Je prolonge et laisse ma réponse pour ceux qui sont toujours sur Rails 2 .. sans le préambule inutile;)
Nick
1

Ok, je vais sans vergogne faire une auto-réponse car personne n'a répondu et j'ai déjà trouvé la réponse :) Définissez ceci 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
William Yeung
la source
Eh bien, j'aime bien votre auto-réponse mais ... Point mineur, instance_variable_defined?(content_var_name)c'est un peu plus net qu'au lieu de tester si c'est nul. Deuxième point plus important, la variable d'instance content_for est obsolète, donc votre solution n'est pas à l'épreuve du temps
Dave Nolan
1

Je ne suis pas sûr des implications sur les performances de l'appel de yield deux fois, mais cela fonctionnera quelle que soit l'implémentation interne de yield (@content_for_xyz est obsolète) et sans code supplémentaire ni méthode d'assistance:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
Enrico
la source