Почему бы не проверить, существует ли content_for или не определено в компиляции представления.
В коде content_for мы можем видеть:
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)
nil
end
Так что в вашем случае, @content_for_body_id
это определить, если content_for по вашему мнению.
Вы можете сделать:
<%= instance_variable_defined?('@content_for_body_id') ? yield(:body_id) : 'super_admin_main' %>
Если вы предпочитаете, вы можете создать помощника после
def yield_or(part, result)
instance_variable_defined?("@content_for_#{part}") ? instance_variable_get("@content_for_#{part}") : result
end
и вызвать егона ваш взгляд
<%= yield_or(:body_id, 'super_admin_main') %>
Это работает только с Rails 2.3.x
В Rails 3:
есть этот метод content_for