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?