Forum: Ruby on Rails Determining whether yields have content

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
4ddf8432a838f716cc499e43131e5e58?d=identicon&s=25 James Englert (Guest)
on 2009-01-05 04:19
(Received via mailing list)
Hey All,
   I would like some logic that would help me determine whether a yield
has
any content to it.  For example:

<div class="submenu">
    <%= yield :submenu %>
</div>

I only want to display the div around the yield if the yield will have
content.

Any ideas?

Thanks,
Jim
Ef0db53920b243d6758c2f6b1306df0d?d=identicon&s=25 Steve Ross (cwd)
on 2009-01-05 04:54
(Received via mailing list)
On Jan 4, 2009, at 7:18 PM, James Englert wrote:

>
> Any ideas?

You can do:

<% if !yield(:submenu).strip.blank? -%>
   <div class="submenu">
     <%= yield :submenu %>
   </div>
<% end -%>

The call may be expensive so you might want to create some other
method of determining whether the submenu is likely to have content.
But this should work.

HTH
4ddf8432a838f716cc499e43131e5e58?d=identicon&s=25 James Englert (Guest)
on 2009-01-05 05:48
(Received via mailing list)
Just confirming, its expensive since it renders the yield twice,
correct?
What if i did something like:

<% yield_contents  = yield(:submenu)
      if !yield_contents.strip.blank? -%>
   <div class="submenu">
    <%= yield_contents %>
  </div>
<% end -%>

Would that work?

I guess I never realized that I could yield twice.  Thanks for the tip.
Much
appreciated.
Ef0db53920b243d6758c2f6b1306df0d?d=identicon&s=25 Steve Ross (cwd)
on 2009-01-05 17:53
(Received via mailing list)
On Jan 4, 2009, at 8:47 PM, James Englert wrote:

> Just confirming, its expensive since it renders the yield twice,
> correct?  What if i did something like:
>
> <% yield_contents  = yield(:submenu)
>       if !yield_contents.strip.blank? -%>
>   <div class="submenu">
>     <%= yield_contents %>
>   </div>
> <% end -%>

That should work. A different solution altogether would be to have the
submenu contain the div wrapper so you can make the test there and
eliminate all the gnarly logic in your layout.
This topic is locked and can not be replied to.