辅助方法范围问题中的递归函数

时间:2011-09-21 06:20:30

标签: ruby-on-rails variables recursion ruby-on-rails-3.1 helpermethods

好的,所以我正在使用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\">&nbsp;</div>"
  commentlist
end

我在控制器中调用这样的话:

@commentlist = create_comments_list(c, @commentlist)

它似乎正在进行完全递归...但是在1个父评论和1个孩子评论的情况下,评论列表仅吐出父评论。如果我记录的东西,我可以看到子项确实被附加到递归调用内的@commentlist,但是当它展开到父进入递归的位置时,commentlist变量不再包含该子项。看来我不理解这些变量的范围......我需要注释列表在从内部递归调用中展开后保留其值。谁能够摆脱一些光明? (或者一些更好的方法可以做到这一点?我的坏风格钟声在我的脑海里消失了)

1 个答案:

答案 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