2010-05-25 14 views
7

Tengo un caso de uso simple rendimiento y por alguna razón desconocida, no se muestra el caso por defecto:Rendimiento y caso por defecto || no hacer caso por defecto de salida

En mi diseño super_admin que tengo:

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

Mi controlador de

class Superadmin::GolfsController < ApplicationController 
    layout "super_admin" 

    def show 

    end 
end 

Mi espectáculo de vista

Con o sin

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

Con: Se muestra sadmin_golfs.

sin: cadena vacía se muestra en lugar de super_admin_main

¿Alguien puede reproducir el mismo comportamiento?

Respuesta

17

Usar paréntesis:

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

O

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

sin ellos es asumiendo yield (:body_id || 'super_admin_main')

EDITAR: Carriles 3 usos ActiveSupport::SafeBuffer en lugar de la secuencia/nula (carriles 2), por lo que la la salida no es nula incluso si no se proporciona content_for. Así que trate de:

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

Actualy stills muestra una cadena vacía cuando no se proporciona content_for. – coulix

+0

Usted no suppy 'content_for' en absoluto o está en blanco como' <% content_for (: body_id) do%><% end %> '? – Voyta

+0

Ver la respuesta editada – Voyta

1

En los carriles 3

plantea método no definido `presente'

+0

Creo que quieres decir" .present? " –

+0

La solución más elegante que he encontrado hasta ahora (sin gemas). Gracias. – Abdulaziz

3

Por qué no prueba si hay o no content_for definen en vista de recopilaciones.

En el código content_for podemos ver:

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 

Así, en su caso, la @content_for_body_id es definir si un content_for está en su punto de vista.

Usted puede hecho:

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

Si prefere puede generar un ayudante después

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

y lo llaman en su vista por

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

Es sólo funciona con Rails 2.3.x

En Rails 3:

hay este método content_for?

23

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

Object#presence es equivalente a object.present? ? object : nil (AS 3 docs RC), y esencialmente permite la sintaxis tradicional con el títulos.

+2

esta es la mejor respuesta para los rieles 3 – cyrilchampier

1

Sé que esta es una vieja pregunta, pero tengo una solución para Rails 2.3.

He ampliado shingara's yield_or método de ayuda por encima de lo que ahora se puede aceptar un bloque:

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 

y esto puede ser usado en sus plantillas:

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

Puede usar content_for?(:body_id), el código será similar.

<%= content_for?(:body_id) ? yield(:body_id) : 'super_admin_main' %> 
Cuestiones relacionadas