2010-05-25 7 views
7

У меня есть простой использовать выход случай и по неизвестным причинам регистр по умолчанию никогда не отображается:Выход и случай по умолчанию || не выход по умолчанию случай

В моем макете super_admin у меня есть:

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

Мой контроллер

class Superadmin::GolfsController < ApplicationController 
    layout "super_admin" 

    def show 

    end 
end 

Моя показать вид

С или без

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

С: sadmin_golfs показано.

без: пустая строка отображается вместо super_admin_main

Можно ли воспроизвести такое же поведение?

ответ

17

использовать круглые скобки:

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

Или

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

Без них она предполагающие yield (:body_id || 'super_admin_main')

EDIT: Rails 3 использует ActiveSupport::SafeBuffer вместо строки/ноль (Rails 2), так что выход не равен нулю, даже если нет content_for. Так что попробуйте:

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

Фактически это неподвижные изображения показывают пустую строку, когда ни один контент не указан. – coulix

+0

Вы вообще не играете 'content_for' или просто пустым, как' <% content_for (: body_id) do%><% end %> '? – Voyta

+0

См. Отредактированный ответ – Voyta

1

В рельсах 3

вызывает неопределенный метод `настоящего»

+0

Я думаю, вы имеете в виду« .present? ». –

+0

Самое элегантное решение, которое я нашел до сих пор (без драгоценных камней). Спасибо. – Abdulaziz

3

Почему нет теста, если есть content_for или не определяют в виде компиляции.

В коде content_for мы можем видеть:

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 

Так что в вашем случае @content_for_body_id это определить, если content_for в вашем представлении.

Вы можете сделал:

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

Если вы предпочитаете вы можете сгенерировать помощник после

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

и назовите его по вашему мнению, по

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

Это работает только с Rails 2,3.х

В Rails 3:

есть этот метод content_for?

23

Попытка <%= yield(:title).presence || 'My Default Title' %>

Object#presence эквивалентно object.present? ? object : nil (AS 3 гс документы), и по существу позволяет традиционный синтаксис с названия.

+2

Это лучший ответ для рельсов 3 – cyrilchampier

1

Я знаю, что это старый вопрос, но у меня есть решение для Rails 2.3.

Я продлил shingara's yield_or вспомогательный метод выше, так что теперь может принимать блок:

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 

и это можно использовать в шаблонах:

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

или

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

Вы можете использовать content_for?(:body_id), код будет как.

<%= content_for?(:body_id) ? yield(:body_id) : 'super_admin_main' %> 
Смежные вопросы