0

好吧,我正在使用Awesome嵌套集在軌道上使用嵌套評論系統。我目前正在實現一個遞歸函數來使嵌套工作(我知道這對於性能來說非常低效,但我只是希望在調整性能之前就能夠工作)。幫助方法範圍問題的遞歸函數

在我的應用程序控制器

所以我有這樣的事情(建築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變量不再包含子節點。看來我不明白這些變量的範圍......我需要評論列表在內部遞歸調用解除後保留它的值。任何人都可以擺脫一些光? (或者一些更好的方法來做這件事嗎?我的壞風格響鈴正在我頭上)

回答

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 
+0

謝謝你的 – Msencenb