2010-05-25 291 views
7

我有一個簡單的產量使用情況和一些未知的原因,默認情況下從未顯示:產量和默認情況||不輸出默認情況下

在我的超級管理員的佈局我有:

<%= 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')

編輯:Rails 3中使用ActiveSupport::SafeBuffer而不是字符串/零(軌道2),因此,即使沒有提供content_for,輸出也不爲零。因此,嘗試:

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

Actualy it stills顯示空字符串,當沒有content_for提供。 – coulix 2010-05-26 07:09:01

+0

你根本不需要'content_for',或者它只是空白的,如<%content_for(:body_id)do%><% end %>'? – Voyta 2010-05-26 08:12:28

+0

查看編輯答案 – Voyta 2010-05-26 08:53:52

1

在Rails 3

引發未定義的方法`現在」

+0

我想你的意思是「.present?」 – 2012-07-25 02:21:45

+0

迄今爲止我找到的最優雅的解決方案(沒有寶石)。謝謝。 – Abdulaziz 2013-11-15 10:01:04

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

如果您prefere後就可以

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。X

在Rails 3:

有這種方法content_for?

23

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

Object#presence相當於object.present? ? object : nil(AS 3 RC文檔),並且基本上允許與傳統的語法標題。

+2

對於導軌3,這是更好的答案 – cyrilchampier 2014-10-20 11:16:22

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) ? yield(:body_id) : 'super_admin_main' %>