Yield and default case || do not output default case Yield and default case || do not output default case ruby ruby

Yield and default case || do not output default case


Try <%= yield(:title).presence || 'My Default Title' %>

Object#presence is equivalent to object.present? ? object : nil (AS 3 rc docs), and essentially allows the traditional syntax with the titles.


Use parentheses:

<%= (yield :body_id) || 'super_admin_main' %>

Or

<%= yield(:body_id) || 'super_admin_main' %>

Without them it is assuming yield (:body_id || 'super_admin_main')

EDIT: Rails 3 uses ActiveSupport::SafeBuffer instead of string/nil (Rails 2), so the output is not nil even if there is no content_for provided. So try:

<%= yield(:body_id).empty? ? 'super_admin_main' : yield(:body_id)%>


Why no test if there are a content_for or not define in view compilation.

In the content_for code we can see :

def content_for(name, content = nil, &block)  ivar = "@content_for_#{name}"  content = capture(&block) if block_given?  instance_variable_set(ivar, "#{instance_variable_get(ivar)}#{content}".html_safe)  nilend

So in your case, the @content_for_body_id is define if a content_for is in your view.

You can made :

<%=  instance_variable_defined?('@content_for_body_id') ? yield(:body_id) : 'super_admin_main' %>

If you prefere you can generate an helper after

def yield_or(part, result)  instance_variable_defined?("@content_for_#{part}") ? instance_variable_get("@content_for_#{part}") : resultend

and call it in your view by

<%= yield_or(:body_id, 'super_admin_main') %>

It's works only with Rails 2.3.x

In Rails 3 :

there are this method content_for?