Rails Ancestry。如何显示所有后代的单个注释?

时间:2015-06-09 16:10:59

标签: ruby-on-rails ruby ruby-on-rails-3

助手/ 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

1 个答案:

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

如果评论不是顶级的话,第二个可能会对性能产生越来越大的影响,并且它们被递归多次调用,但没有更好的理解,这个问题很难回答。