2010-05-25 15 views
7

mam prosty przypadek użycia wydajność iz jakiegoś nieznanego powodu domyślny przypadek nie jest pokazany:Plon i przypadek domyślny || nie domyślne wyjście przypadek

W moim układzie super_admin mam:

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

Mój kontroler

class Superadmin::GolfsController < ApplicationController 
    layout "super_admin" 

    def show 

    end 
end 

Mój pokaz widok

z lub bez

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

z: sadmin_golfs pokazano.

bez: pusty ciąg jest wyświetlany zamiast super_admin_main

ktoś może odtworzyć ten sam problem?

Odpowiedz

17

używać nawiasów:

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

Albo

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

Bez nich przybiera yield (:body_id || 'super_admin_main')

EDIT: Rails 3 wykorzystuje ActiveSupport::SafeBuffer zamiast ciąg/nil (Rails 2), a więc moc wyjściowa nie jest zerowa, nawet jeśli nie podano wartości content_for. Więc spróbuj:

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

Rzeczywista nieruchomość pokazuje pusty ciąg, gdy nie podano treści content_for. – coulix

+0

Nie nadajesz 'content_for' w ogóle lub jest po prostu puste, jak' <% content_for (: body_id) do%><% end %> '? – Voyta

+0

Zobacz zredagowaną odpowiedź – Voyta

1

w szynach 3

podnosi niezdefiniowanej metody `obecny”

+0

Myślę, że masz na myśli" .present? " –

+0

Najbardziej eleganckie rozwiązanie, jakie dotychczas znalazłem (bez klejnotów). Dziękuję Ci. – Abdulaziz

3

Dlaczego żaden test, jeśli istnieje content_for lub nie określają w widoku kompilacji.

W kodzie content_for widzimy:

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 

Więc w przypadku @content_for_body_id jest określić, czy content_for jest w widoku.

Można się:

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

Jeśli preferujemy można wygenerować pomocnika po

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

i nazwać go w widoku przez

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

Nadszedł działa tylko z Rails 2.3.x

W szyny 3:

istnieje metoda content_for?

23

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

Object#presence odpowiada object.present? ? object : nil (jak 3 Dokumenty RC), a przede wszystkim umożliwia tradycyjnej składni z innymi tytuły.

+2

to jest lepsza odpowiedź dla szyn 3 – cyrilchampier

1

Wiem, że to stare pytanie, ale mam rozwiązanie dla Rails 2.3.

mam przedłużony shingara's yield_or metoda pomocnika powyżej więc może teraz przyjąć blok:

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 

a to może być używane w szablonach:

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

lub

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

Możesz użyć content_for?(:body_id), kod będzie podobny.

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