如果没有任何调用,请不要显示围绕收益的div

时间:2011-09-09 08:32:50

标签: ruby-on-rails

我在布局中有这个片段:

    <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 

3 个答案:

答案 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,如果它是空的。