У меня есть пара помощников Rails, один из которых предназначен для принятия блока, а другой просто рендерит кнопку. Вот упрощенные версии определения помощника:
def nav_wrapper(nav_at, id, css_class, &block)
"<ul class="complicated">\n #{yield} \n</ul>".html_safe
end
def nav_btn(nav_at, caption, id = caption.downcase.dasherize)
"Nav button codes goes here".html_safe
end
Я пытаюсь настроить все так, чтобы я мог сделать что-то вроде этого:
<%= nav_wrapper(@nav_at, "Top Nav", "class") do %>
<%= nav_btn(@nav_at, "Foo", "id") %>
<%= nav_btn(@nav_at, "Bar", "id") %>
<%= nav_wrapper(@nav_at, "Sub Nav", "class") do %>
<%= nav_btn(@nav_at, "SubFoo", "id") %>
<%= nav_btn(@nav_at, "SubBar", "id") %>
<% end %>
<% end %>
Но yield
в методе nav_wrapper
выбирает только последний оператор каждого блока. Таким образом, в этом примере я получаю оболочку Top Nav, Foo и Bar пропускаются, я получаю оболочку Sub Nav (являющуюся последним оператором во внешнем блоке nav_wrapper
), SubFoo пропускается, и я получаю SubBar (будучи последним оператор во внутреннем блоке nav_wrapper
).
Я знаю, что причина такого поведения в том, что блок кода неявно возвращает последнее оцененное значение, но я знаю, что есть много помощников шаблонов, которые отображают все промежуточные строки (например, form_for
). Может ли кто-нибудь помочь мне понять, в чем тут фокус?