好的,所以我正在使用Awesome嵌套集在rails上使用嵌套注释系统。我目前正在实现一个递归函数来使嵌套工作(我知道性能非常低效,但我只是希望这在我调整性能之前工作)。
所以在我的应用程序控制器中我有这样的东西(构建html):
def create_comments_list(comment, commentlist)
commentlist += "<div class=\"comment\" style=\"padding-left:20px;\"><div style=\"display:none;\" class=\"parent_id\">#{comment.id}</div>#{comment.user.name}:<br/><div class=\"ccontent\">#{comment.content}</div><br/><a href=\"#reply\" class=\"reply\" style=\"color:black;\">Reply</a>";
children = comment.children
children.each do |c|
create_comments_list(c, commentlist)
end
commentlist += "</div><div class=\"shortdivider\"> </div>"
commentlist
end
我在控制器中调用这样的话:
@commentlist = create_comments_list(c, @commentlist)
它似乎正在进行完全递归...但是在1个父评论和1个孩子评论的情况下,评论列表仅吐出父评论。如果我记录的东西,我可以看到子项确实被附加到递归调用内的@commentlist,但是当它展开到父进入递归的位置时,commentlist变量不再包含该子项。看来我不理解这些变量的范围......我需要注释列表在从内部递归调用中展开后保留其值。谁能够摆脱一些光明? (或者一些更好的方法可以做到这一点?我的坏风格钟声在我的脑海里消失了)
答案 0 :(得分:2)
如果要改变<<
参数,请使用铲运算符+=
代替commentslist
。
+=
创建一个新的字符串对象并将其分配给您的变量,但堆栈中的更多功能仍然具有对旧字符串值的引用。 <<
更改现有字符串对象。
a = "foo" # => "foo"
a.object_id # => 69847780
a += "bar" # => "foobar"
a.object_id # => 69786550 (note this is not the same object as before)
b = "foo" # => "foo"
b.object_id # => 69764530
b << "bar" # => "foobar"
b.object_id # => 69764530