Rails controlla se yield: area è definita in content_for


97

Voglio eseguire un rendering condizionale a livello di layout in base al modello effettivo definito content_for(:an__area), qualche idea su come ottenerlo?


Vedi la mia risposta per la creazione di un metodo di supporto per incapsulare questo comportamento in Rails 3.
tristanm

Risposte:


217

@content_for_whateverè deprecato. Usa content_for?invece, in questo modo:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>

16
Helper content_for?esiste solo in Rails 3. In Rails 2 potresti usare la @content_for_...variabile di istanza.
timore che l'

10

non proprio necessario per creare un metodo di supporto:

<% if @content_for_sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

poi ovviamente secondo te:

<% content_for :sidebar do %>
  ...
<% end %>

Lo uso sempre per passare in modo condizionale tra un layout a una e due colonne


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

2

Può creare un aiutante:

def content_defined?(var)
  content_var_name="@content_for_#{var}"    
  !instance_variable_get(content_var_name).nil?
end

E usa questo nel tuo layout:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
eirikir

Sono d'accordo @eirikir, non sono sicuro di cosa stesse pensando il mio io di 6 anni più giovane. Sto estendendo e lasciando la mia risposta a quelli ancora su Rails 2 .. senza il preambolo non necessario;)
Nick

1

Ok, farò spudoratamente un'auto risposta poiché nessuno ha risposto e ho già trovato la risposta :) Definiscilo come metodo di supporto in application_helper.rb o ovunque tu abbia trovato conveniente.

  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, beh, mi piace la tua risposta personale ma ... Punto minore, instance_variable_defined?(content_var_name)è un po 'più ordinato invece di provare se è zero. Secondo punto più importante, la variabile content_for instance è deprecata, quindi la tua soluzione non è a prova di futuro
Dave Nolan,

1

Non sono sicuro delle implicazioni sulle prestazioni della chiamata di yield due volte, ma ciò andrà indipendentemente dall'implementazione interna di yield (@content_for_xyz è deprecato) e senza alcun codice aggiuntivo o metodi di supporto:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.