Rails检查yield:area是否在content_for中定义

时间:2008-10-11 08:09:22

标签: ruby-on-rails layout yield

我想在布局级别根据实际模板定义content_for(:an__area)进行条件渲染,知道如何完成这项工作吗?

6 个答案:

答案 0 :(得分:206)

@content_for_whatever已弃用。 请改用content_for?,如下所示:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>

答案 1 :(得分:10)

不一定需要创建辅助方法:

<% if @content_for_sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

当然在你看来:

<% content_for :sidebar do %>
  ...
<% end %>

我一直使用它来有条件地在一列和两列布局之间进行

答案 2 :(得分:2)

可以创建一个帮手:

def content_defined?(var)
  content_var_name="@content_for_#{var}"    
  !instance_variable_get(content_var_name).nil?
end

在你的布局中使用它:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>

答案 3 :(得分:2)

<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>

答案 4 :(得分:1)

好的,我会无耻地做自我回复,因为没有人回答,我已经找到了答案:) 在application_helper.rb或您认为方便的任何地方将其定义为辅助方法。

  def content_defined?(symbol)
    content_var_name="@content_for_" + 
      if symbol.kind_of? Symbol 
        symbol.to_s
      elsif symbol.kind_of? String
        symbol
      else
        raise "Parameter symbol must be string or symbol"
      end

    !instance_variable_get(content_var_name).nil?

  end

答案 5 :(得分:1)

我不确定调用yield两次的性能影响,但无论yield的内部实现如何(@content_for_xyz已弃用)且没有任何额外的代码或辅助方法,这都会有效:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>