使用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
答案 0 :(得分:3)
这不是你想要的答案,但是会帮助你
<强>嵌套强>
我们使用ancestry
gem实现了一个真正的“嵌套”评论显示(只需查看closure_tree
- 非常好,将会更多地研究这个)。
我称之为“真正”嵌套,因为如果你想要为回复进行嵌套以及只是标准化的评论,你必须做一些特别的事情。您必须执行recursive loop,包括您需要的所有嵌套注释
要实现这一目标,您需要做三件事:
- 模型中的层次结构
- 能够正确访问层次结构(儿童/父母等)
- 递归视图以显示所有
醇>
以下是我们如何做到的:
<强>层次强>
模型中的层次结构是第一步,也是最重要的步骤。您的closure_tree
示例似乎很好地证明了这一点。我们使用了ancestry
- 似乎他们都以不同的方式获得了相同的结果:
从数据中可以看出,您将能够看到存储数据的层次结构使您能够正确地调用它们(这对于显示它们至关重要)。 Ancestry使用以下格式表示结构:parent_1/parent_2
- 我相信closure_tree
有点不同
-
使用强>
正确设置数据库后,您必须确定对数据的访问权限。
我们使用Ancestry's children
method:
这允许我们循环遍历对象,然后我们可以从中调用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