2010-05-25 231 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' %>