使用gem'close_tree'在Rails 4中嵌套注释

时间:2014-09-05 00:03:29

标签: ruby-on-rails ruby nested nested-attributes

使用gem' closure_tree'

在Rails 4中嵌套注释

鉴于评论是文章的嵌套资源,我如何从sitepoint教程重构以下代码来创建嵌套评论?

特别是,我如何整合这两行:

@comment = parent.children.build(comment_params)

@comment = @article.comments.create(comment_params)

http://guides.rubyonrails.org/getting_started.html

的routes.rb

resources :articles do
  resources :comments
end

comments_controller.rb

class CommentsController < ApplicationController
  def create
    @article = Article.find(params[:article_id])
    @comment = @article.comments.create(comment_params)
    redirect_to article_path(@article)
  end


  private
    def comment_params
      params.require(:comment).permit(:commenter, :body)
    end
end

http://www.sitepoint.com/nested-comments-rails/

comments_controller.rb

class CommentsController < ApplicationController
  def create
    if params[:comment][:parent_id].to_i > 0
      parent = Comment.find_by_id(params[:comment].delete(:parent_id))
      @comment = parent.children.build(comment_params)
    else
      @comment = Comment.new(comment_params)
    end
  end


  private
      def comment_params
      params.require(:comment).permit(:body)
  end
end

2 个答案:

答案 0 :(得分:3)

这不是你想要的答案,但是会帮助你


<强>嵌套

enter image description here

我们使用ancestry gem实现了一个真正的“嵌套”评论显示(只需查看closure_tree - 非常好,将会更多地研究这个)。

我称之为“真正”嵌套,因为如果你想要为回复进行嵌套以及只是标准化的评论,你必须做一些特别的事情。您必须执行recursive loop,包括您需要的所有嵌套注释

要实现这一目标,您需要做三件事:

  
      
  1. 模型中的层次结构
  2.   
  3. 能够正确访问层次结构(儿童/父母等)
  4.   
  5. 递归视图以显示所有
  6.   

以下是我们如何做到的:


<强>层次

模型中的层次结构是第一步,也是最重要的步骤。您的closure_tree示例似乎很好地证明了这一点。我们使用了ancestry - 似乎他们都以不同的方式获得了相同的结果:

enter image description here

从数据中可以看出,您将能够看到存储数据的层次结构使您能够正确地调用它们(这对于显示它们至关重要)。 Ancestry使用以下格式表示结构:parent_1/parent_2 - 我相信closure_tree有点不同

-

使用

正确设置数据库后,您必须确定对数据的访问权限。

我们使用Ancestry's children method

enter image description here

这允许我们循环遍历对象,然后我们可以从中调用children方法:

-

递归循环

最后,您将能够将所有这些与您的观点联系在一起:

#app/views/comments/index.html.erb
<%= render partial: "comment", locals: { collection: @comments } %>

#app/views/comments/_comment.html.erb
<% collection.arrange.each do |comment, sub_item| %>
    <li>
      <%= link_to comment.title, your_path(comment) %>
      <%= render partial: "category", locals: { collection: category.children } if category.has_children? %>
    </li>
<% end %>

这个简单的partial将为您提供创建真正嵌套的注释结构所需的递归。当然,它取决于你的closure_tree宝石,但无论如何都应该给你一些好主意!

答案 1 :(得分:0)

由于评论了belongs_to文章,你应该可以做类似的事情。

@comment = parent.children.build(comment_params)
@comment.article_id = @article.id #(get the article id)
@comment.save