У меня есть простой вариант использования урожая, и по некоторой неизвестной причине никогда не показывают случай по умолчанию:
В моем super_admin расположении я имею:
<%= yield :body_id || 'super_admin_main' %>
Мой контроллер
class Superadmin::GolfsController < ApplicationController
layout "super_admin"
def show
end
end
Мое выставочное представление
С или без
<% content_for(:body_id) do %>sadmin_golfs<% end %>
С: sadmin_golfs показывают.
без: пустую строку показывают вместо super_admin_main
Кто-либо может воспроизвести то же поведение?
Используйте круглые скобки:
<%= (yield :body_id) || 'super_admin_main' %>
или
<%= yield(:body_id) || 'super_admin_main' %>
Без них предполагается yield (: body_id || 'super_admin_main')
EDIT: Rails 3 использует ActiveSupport :: SafeBuffer
вместо строки / nil (Rails 2), поэтому вывод не равен нулю, даже если нет content_for
предоставлено. Итак, попробуйте:
<%= yield(:body_id).empty? ? 'super_admin_main' : yield(:body_id)%>
Почему нет проверки, есть ли 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?
Попробуйте <% = yield (: title) .presence || «Мой заголовок по умолчанию»%>
Наличие № объекта
эквивалентно object.present? ? object: nil
(AS 3 rc docs), и по существу позволяет использовать традиционный синтаксис с заголовками.