102

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

4

6 回答 6

224

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

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
于 2010-03-11T22:05:59.870 回答
10

创建辅助方法并不是必需的:

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

那么当然在你看来:

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

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

于 2009-03-11T20:36:57.350 回答
3
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
于 2014-02-18T16:49:28.580 回答
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 %>
于 2009-03-11T20:28:14.453 回答
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
于 2008-10-11T16:01:17.763 回答
1

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

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
于 2009-11-16T12:01:49.347 回答