Я попытался найти пример того, что вы пытаетесь сделать, и обнаружил, что наиболее близким к нему является form_for
.
Затем я попытался выяснить, почему ваш путь не работает.
После отслеживания выполнения кода кажется, что блок пытается отрендерить себя, предполагая, что находится внутри экземпляра ActionView::Context
, где он собирается найти Context # output_buffer , где он находит nil
и не могу вызвать safe_append
.
Теперь, как решить эту проблему.
Вы должны убедиться, что все, что вы пытаетесь визуализировать в представлении, имеет весь контекстон должен визуализировать себя, что и делает Rails в форме_фор
<%= @menu.start do |m| -%>
<% m.menu_item some_path_in_routesrb,
title: "Dashboard",
details: "12 New Updates",
icon: "feather:home",
highlight: true
%>
<% m.menu_item next_path,
title: "Magical stuff",
details: "unicorn registry",
icon: "fontawesome:rainbow",
highlight: true
%>
<% end -%>
И иметь это в классе меню
def start(&block)
if block_given?
yield self
else
raise "menu expected a block!"
end
rescue => e
@logger.ap e.message, :error
@logger.ap e.backtrace, :error
ensure
if @menu_items.size > 0
return content_tag(:div, content_tag(:ul, self.display, class: "menu-items"), class:"sidebar-menu")
else
return "There is nothing to render here. Place an item in the menu"
end
end
Теперь можно реализовать идею eval_instance
, ноне будет на самом деле таким чистым ИМХО, поскольку это будет означать, что вы попытаетесь имитировать то же поведение при разборе ERB.