我想在布局级别根据实际模板定义content_for(:an__area)
进行条件渲染,知道如何完成这项工作吗?
答案 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 %>