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 変数には子が含まれなくなります。これらの変数のスコープを理解していないようです...内部再帰呼び出しから巻き戻された後、その値を保持するためにコメントリストが必要です。光を当てることができる人はいますか?(または、これを行うためのより良い方法がいくつかありますか?私の悪いスタイルのベルが頭の中で鳴っています)

4

1 に答える 1

2

引数を変更したい場合は、<<代わりにshovel 演算子を使用してください。+=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
于 2011-09-21T06:57:21.907 に答える