Я придумал пару решений, но я далеко не эксперт в системе шаблонов Rails.
Первый использует переменную экземпляра:
def helper_a(&block)
with_context(:tag_a) do
content = capture(&block)
content_tag :tag_a, content
end
end
def helper_b(&block)
with_context(:tag_b) do
content = capture(&block)
content_tag :tag_b, content
end
end
def helper_c(&block)
with_context(:tag_c) do
content = capture(&block)
content_tag :tag_c, content
end
end
def with_context(name)
@context ||= []
@context.push(name)
content = yield
@context.pop
content
end
который используется следующим образом:
<%= helper_a do %>
Content for a
<%= helper_b do %>
Content for b
<%= helper_c do %>
Content for c
... and so on ...
<% end %>
<% end %>
<% end %>
И другое решение, которое передает контекст на каждом шаге:
def helper_a(context = [], &block)
context = capture(context.push(:tag_a), &block)
content_tag(:tag_a, content)
end
def helper_b(context = [], &block)
context = capture(context.push(:tag_b), &block)
content_tag(:tag_b, content)
end
def helper_c(context = [], &block)
context = capture(context.push(:tag_c), &block)
content_tag(:tag_c, content)
end
, которое используется таким образом:
<%= helper_a do |context| %>
Content for a
<%= helper_b(context) do |context| %>
Content for b
<%= helper_c(context) do |context| %>
Content for c
... and so on ...
<% end %>
<% end %>
<% end %>
Но я бы действительно советовал не использовать ни одно из этих решений, если все, что вы делаете, это стилизация CSS и / или манипулирование Javascript.Это действительно усложняет помощников, может привести к ошибкам и т. Д.
Надеюсь, это поможет.