开发者

Recursive function in helper method scoping issues

开发者 https://www.devze.com 2023-04-06 03:00 出处:网络
Ok so I\'m playing around with a nested comments system on rails using Awesome nested set. I\'m currently implementing a recursive function to get the nesting working (I know for performance this is t

Ok so I'm playing around with a nested comments system on rails using Awesome nested set. I'm currently implementing a recursive function to get the nesting working (I know for performance this is terribly inefficient, but I just want this to work before I tune for performance).

So in my application controller I have something like this (building 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

And I invoke in the controller like this:

@commentlist = crea开发者_JAVA技巧te_comments_list(c, @commentlist)

It seems to be doing the full recursion... however in the case of 1 parent comment and 1 child comment the commentlist only spits out the parent comment. If I log things I can see that the child is indeed being appended to the @commentlist inside the recursive call, but when it unwinds to where the parent entered the recursion the commentlist variable no longer contains the child. It appears I don't understand the scoping of these variables... I need commentlist to retain its value after it unwinds from the inner recursion call. Anyone able to shed some light? (Or some better ways of doing this? My bad style bell is going off in my head)


Use the shovel operator << instead of += if you want to mutate your commentslist argument.

+= creates a new string object and assigns it to your variable, but the functions further up in the stack still have the reference to the older string value. << changes the existing string object.

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
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号