助手/ comments_helpers.rb
def nested_comments(comments)
comments.map do |comment, sub_comments|
render(comment) + content_tag(:div, nested_comments(sub_comments), :class => 'nested_comments')
end.join.html_safe
end
def nested_comment(one_comment)
one_comment.instance_eval do |comment, sub_comments|
render(comment) + content_tag(:div, nested_comments(sub_comments), :class => 'nested_comments')
end.join.html_safe
end
控制器/ comments_controller.rb
def show
@comment = Comment.find(params[:id])
end
视图/评论/ show.html.erb
...
<%= nested_comment(@comment) %>
...
我一直收到此错误,但我不知道原因: 未定义的方法`render&#39;对于#
如果我删除方法的渲染部分,我会收到content_tag的另一个错误
有人可以告诉我如何解决这些错误吗?
评论架构(摘自下方评论部分)
create_table "comments", force: :cascade do |t|
t.text "content"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "ancestry"
end
答案 0 :(得分:0)
这有用吗?我在黑暗中被刺,因为Comment
没有明确定义。
我之前从未使用过ancestry
,但这里有一个基于文档的实现的猜测:
def nest_comments(*comments)
comments.map do |comment|
comment_block = render(comment)
comment_block += content_tag(:div,
nested_comments(*comment.children),
:class => 'nested_comments') if comment.has_children?
comment_block
end.join.html_safe
end
这将以递归方式遍历所有注释和子注释(请注意此处的极端n + 1问题,因为如果sub_comments以递归方式执行新查询,则可能会非常快速地创建性能影响。
您应该可以像
一样打电话<%= nest_comments(@comment) %>
或
@comments = Comment.all
<%= nest_comments(*@comments.to_a) %>
如果评论不是顶级的话,第二个可能会对性能产生越来越大的影响,并且它们被递归多次调用,但没有更好的理解,这个问题很难回答。