我在布局中有这个片段:
<div class="yui-g" style="min-width: 760px">
<!-- top row -->
<%= yield :top_row %>
</div>
如果没有调用content_for :top_row
,那么我在页面上留下一个带样式的空矩形。正确的做法是重新布局(以及整个网站tbh),但现在不是一个选项(遗留债务和更迫切的要求)。有没有办法在一些代码中包含div来检查yield是否实际上屈服于任何东西,如果是这样的话就不渲染它?
编辑 - 这是一个rails 2.2.2项目btw。
编辑2
@arnep提出以下建议:
<% content = yield :top_row %>
<% unless content.blank? %>
<div class="yui-g" style="min-width: 760px">
<%= content %>
</div>
<% end %>
我接下来要做的就是把它包装成一个帮手,我可以这样使用:
<% yield_if(:top_row) do |content| %>
<div class="yui-g" style="min-width: 760px">
<%= content %>
</div>
<% end %>
我正在努力解决这个问题,因为它涉及在传递给方法的块中屈服并屈服于:top_row中的内容。这是我尝试过的,它不起作用 - 它将整个页面呈现为返回的字符串。我想我已经以某种方式倒退了。
def yield_if(content_name, &block)
content = yield content_name
if content.blank?
""
else
yield content
end
end
答案 0 :(得分:3)
是的,有一个content_for?帮助器只是为了检查。
答案 1 :(得分:1)
我查看了2.2.2 content_for
,并使用了instant_variable_set
。您可以使用instance_variable_defined?
来查询:top_row
内容。
另一个想法可能是将内容分配给变量<% content = yield(:top_row) %>
,然后使用content.present?
来规避空div
。
答案 2 :(得分:0)
由于您无法访问content_for?
,因此唯一可以使用javascript的方法是删除div,如果它是空的。