.erb 模板不支持递归函数吗?

Are recursion functions not supported in .erb templates?

好的,基本上我有这样的东西:

someView.erb

 <ul>
    <% @objects.each do |object| %>
      <%= printAllChildObjects(object) %>
    <% end %>
 </ul>

app.rb

def printAllChildObjects(object)
   "<li>#{object.attributes['name']}</li>"
    if object.children.first.name == "Error"
      break
    else 
      object.elements.first.each do |innerObject| 
         printAllChildObjects(innerObject)
      end
    end
end

TL:DR;我正在用 REXML 解析一些 XML 文件(XML 解析器内置于 Ruby,出于一些荒谬的公司原因我不能使用 Nokogiri) .这个 XML 文件的节点可能有也可能没有嵌套在其中的子节点,并且其中的子节点数量不等。我通过使用 puts 语句并观察终端来尝试我的递归函数,它按预期工作。

但是,当我尝试合并上面的视图文件时,我反而得到了带有三个点的空框,即 [ ... ] 每个对象应该打印的地方。疯狂的是,盒子的数量与对象的数量相匹配,并且在使用 Chrome 开发工具检查 html 时,您可以看到整个对象节点,而不仅仅是 object.attributes['name'](即只是节点中的名称属性)。

此外,当我删除递归调用并仅保留函数中的 "<li>#{object.attributes['name']}</li>" 部分时,HTML 再次起作用!所以我相当确定递归是破坏 HTML 渲染的原因。有什么办法可以解决这个问题吗?我会很感激哪怕是最细微的见解。

哦,我正在使用 Sinatra,而不是 Rails。

试试类似的东西:

<ul>
  <% @objects.each do |object| %>
    <% print_children_for(object).flatten.each |li_tag| %>
     <%= li_tag %>
    <% end %>
  <% end %>
</ul>

def print_children_for(object, parent = nil)
  mark_up = []
  mark_up << parent.nil? ? "<li>#{object.attributes['name']}</li>" : parent

  return mark_up if object.children.first.name == "Error"
  object.elements.first.each do |innerObject| 
     print_children_for(innerObject, markup)
  end
end

有一些调整需要完成(在某些地方保护 nil 值),我正在做这些,没有检查它,但也许类似的事情可以帮助你。

按照附加到某个 HTML 缓冲区并生成显式函数 returns 的建议,以下代码解决了我的问题:

def printAllChildObjects(refObject, html)
  html << "<li>#{refObject.attributes['name']}</li>"

  if refObject.children.first.name == "Error"
     break
  else
     refObject.elements.first.each do |innerObject|
         return printAllChildObjects(innerObject, html)
     end
  end

 return html
end