收益率和默认情况||不输出默认情况

时间:2010-05-25 18:06:06

标签: ruby-on-rails ruby ruby-on-rails-3 view

我有一个简单的yield用例,由于某些未知原因,默认情况从未显示过:

在我的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

任何人都可以重现相同的行为吗?

7 个答案:

答案 0 :(得分:26)

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

Object#presence相当于object.present? ? object : nil(AS 3 rc docs),基本上允许使用标题的传统语法。

答案 1 :(得分:19)

使用括号:

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

或者

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

没有它们就假设yield (:body_id || 'super_admin_main')

编辑:Rails 3使用ActiveSupport::SafeBuffer而不是string / nil(Rails 2),因此即使没有提供content_for,输出也不是nil。所以试试:

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

答案 2 :(得分: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,则定义@content_for_body_id

你可以:

<%=  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.x

在Rails 3中:

有这种方法content_for?

答案 3 :(得分:1)

在rails 3中

引发未定义的方法`present'

答案 4 :(得分: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' %>

答案 5 :(得分:0)

<div class= <%= (yield :content_with_bunners).present? ? yield(:content_with_bunners) : "col-md-10"%>>

答案 6 :(得分:0)

您可以使用content_for?(:body_id),代码就像。

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