【发布时间】:2023-03-29 00:57:01
【问题描述】:
我想根据实际模板定义content_for(:an__area)在布局级别进行条件渲染,知道如何完成吗?
【问题讨论】:
-
请参阅我的answer,了解如何在 Rails 3 中创建一个帮助方法来封装此行为。
标签: ruby-on-rails layout yield
我想根据实际模板定义content_for(:an__area)在布局级别进行条件渲染,知道如何完成吗?
【问题讨论】:
标签: ruby-on-rails layout yield
@content_for_whatever 已弃用。
请改用content_for?,如下所示:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
【讨论】:
content_for? 仅存在于 Rails 3 中。在 Rails 2 中,您可以使用 @content_for_... 实例变量。
不需要创建辅助方法:
<% if @content_for_sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
那么当然在你看来:
<% content_for :sidebar do %>
...
<% end %>
我一直使用它来有条件地在一列和两列布局之间切换
【讨论】:
<%if content_for?(:content)%>
<%= yield(:content) %>
<%end%>
【讨论】:
可以创建助手:
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 %>
【讨论】:
好吧,我会无耻地做一个自我回复,因为没有人回答,我已经找到了答案:) 在 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
【讨论】:
instance_variable_defined?(content_var_name) 比测试它是否为 nil 更简洁一些。第二大点, content_for 实例变量已被弃用,因此您的解决方案不是面向未来的
我不确定两次调用 yield 对性能的影响,但是无论 yield 的内部实现如何(@content_for_xyz 已弃用)并且没有任何额外的代码或辅助方法,这都会起作用:
<% if yield :sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
【讨论】: