【发布时间】:2018-08-01 22:01:06
【问题描述】:
好的,基本上我有这样的东西:
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 文件(Ruby 内置的 XML 解析器,由于一些可笑的公司原因,我不能使用 Nokogiri)。该 XML 文件的节点中可能嵌套了也可能没有嵌套的子节点,并且其中的子节点数量不等。我通过使用puts 语句并观察终端尝试了我的递归函数,它按预期工作。
但是,当我尝试合并上面的视图文件时,我得到了带有三个点的空框,即[ ... ],每个对象都应该在其中打印。疯狂的是,框的数量与对象的数量相匹配,在使用 Chrome 开发工具检查 html 时,您可以看到整个对象节点,而不仅仅是 object.attributes['name'](即节点中的名称属性)。
另外,当我删除递归调用并在函数中保留"<li>#{object.attributes['name']}</li>" 部分时,HTML 再次工作!所以我相当肯定递归是破坏 HTML 渲染的原因。有什么办法可以解决这个问题吗?即使是最细微的见解,我也会感激不尽。
哦,我使用的是 Sinatra,而不是 Rails。
【问题讨论】:
-
如果没有显式返回任何内容,Ruby 将返回最后计算的表达式。如果明确不想连接到视图的输出缓冲区,则应继续附加到对象并返回它。
-
我认为得到的是因为
object.elements.first.each正在返回三个对象,这就是.each的工作方式。尝试将.each更改为.collect。不过,这可能不是你所需要的。 -
@JoshBrody 你听说过
concat的替代方法吗?因为那是Rails 方法?
标签: ruby-on-rails ruby sinatra erb