2010-05-25 10 views
7

Ho un semplice caso d'uso resa e per qualche motivo sconosciuto il caso di default è mai mostrato:Resa e caso di default || non caso di default di uscita

Nel mio layout super_admin ho:

<%= yield :body_id || 'super_admin_main' %> 

mio regolatore

class Superadmin::GolfsController < ApplicationController 
    layout "super_admin" 

    def show 

    end 
end 

Il mio spettacolo vista

Con o senza

<% content_for(:body_id) do %>sadmin_golfs<% end %> 

Con: sadmin_golfs è mostrato.

senza: stringa vuota viene visualizzato al posto del super_admin_main

Chiunque può riprodurre lo stesso comportamento?

risposta

17

Utilizzare le parentesi:

<%= (yield :body_id) || 'super_admin_main' %> 

Oppure

<%= yield(:body_id) || 'super_admin_main' %> 

Senza di loro sta assumendo yield (:body_id || 'super_admin_main')

EDIT: Rails 3 usa ActiveSupport::SafeBuffer anziché stringa/nullo (rotaie 2), per cui la l'output non è nullo anche se non è fornito content_for. In modo da provare:

<%= yield(:body_id).empty? ? 'super_admin_main' : yield(:body_id)%> 
+0

In realtà, le immagini fisse mostrano una stringa vuota quando non viene fornito content_for. – coulix

+0

Non si suppone 'content_for' o è vuoto come' <% content_for (: body_id) do%><% end %> '? – Voyta

+0

Vedi risposta modificata – Voyta

1

in Rails 3

solleva metodo non definito `presenti'

+0

Penso che tu intenda" .present? " –

+0

La soluzione più elegante che ho trovato finora (senza gemme). Grazie. – Abdulaziz

3

Perché non prova se ci sono un content_for o non definiscono in vista di compilazione.

Nel codice content_for possiamo vedere:

def content_for(name, content = nil, &block) 
    ivar = "@content_for_#{name}" 
    content = capture(&block) if block_given? 
    instance_variable_set(ivar, "#{instance_variable_get(ivar)}#{content}".html_safe) 
    nil 
end 

Quindi nel tuo caso, il @content_for_body_id è definire se un content_for è nel vostro punto di vista.

Si può fatto:

<%= instance_variable_defined?('@content_for_body_id') ? yield(:body_id) : 'super_admin_main' %> 

Se preferite potete generare un aiutante dopo

def yield_or(part, result) 
    instance_variable_defined?("@content_for_#{part}") ? instance_variable_get("@content_for_#{part}") : result 
end 

e chiamarlo nella vista da

<%= yield_or(:body_id, 'super_admin_main') %> 

E 'funziona solo con Rails 2.3.x

In Rails 3:

ci sono questo metodo content_for?

23

Prova <%= yield(:title).presence || 'My Default Title' %>

Object#presence è equivalente a object.present? ? object : nil (AS 3 documenti rc), e consente essenzialmente la sintassi tradizionale con la titoli.

+2

questa è la risposta migliore per i binari 3 – cyrilchampier

1

So che questa è una domanda vecchia ma ho una soluzione per Rails 2.3.

ho esteso shingara's yield_or metodo di supporto di cui sopra in modo che ora può accettare un blocco:

module ApplicationHelper 
    def yield_or(name, content = nil, &block) 
    ivar = "@content_for_#{name}" 

    if instance_variable_defined?(ivar) 
     content = instance_variable_get(ivar) 
    else 
     content = block_given? ? capture(&block) : content 
    end 

    block_given? ? concat(content) : content 
    end 
end 

e questo può essere utilizzato nei modelli:

<% yield_or :something do %> 
    <p>something else</p> 
<% end %> 

o

<%= yield_or :something, 'something else' %> 
0
<div class= <%= (yield :content_with_bunners).present? ? yield(:content_with_bunners) : "col-md-10"%>> 
0

È possibile utilizzare content_for?(:body_id), il codice sarà come.

<%= content_for?(:body_id) ? yield(:body_id) : 'super_admin_main' %> 
Problemi correlati