.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
好的,基本上我有这样的东西:
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