所以我使用 acts_as_commentable_with_threading 作为类似于Reddit的评论系统。
因此,在某个项目的展示页面上,我有一个form_for( items / show.html.haml ):
- if user_signed_in?
%h5 Have something to say?
= form_for([@item, @new_comment], remote: true) do |f|
.form-group
= f.text_area :body, class: "form-control", rows: "3"
= f.hidden_field :user_id, value: current_user.id
.form-group
= f.submit "Submit", class: "btn btn-sm"
使用控制器( items_controller.rb ):
def show
@item = Item.find(params[:id])
@comments = @item.comment_threads
if user_signed_in?
@new_comment = Comment.build_from(@item, current_user.id, "")
end
end
然后会有一个 create.js.erb ,它会将新制作的评论附加到页面上
$('#comments').append("<%= escape_javascript(render partial: 'comment', locals: { comment: @comment } ) %>");
if ("<%= @comment.body %>") {
$("#comment_body").val('')
}
这本身就有效。我渲染每个注释,然后在每个注释的部分内部,如果它们有任何子项,我也会渲染子注释。
如...:
- if !@comments.empty?
= render partial: 'comments/comment', collection: @item.root_comments, as: :comment
然而,每条评论都能得到回复,而这些回复可以有自己的回复(再次,像Reddit)。因此,当我尝试与孩子回复做同样的事情时,它给了我500错误。
= form_for([@item, @new_comment], remote: true, html: { class: "comment-reply", id: "replyto_#{comment.id}" }) do |f|
.col-md-5
.form-group
= f.text_area :body, class: "form-control", rows: "3"
= f.hidden_field :user_id, value: current_user.id
= f.hidden_field :parent_id, value: comment.id
.form-group
= f.submit "Submit", class: "btn btn-sm"
%div{style: "clear:both;"}
所以我的问题是,我如何为子评论创建一个form_for,然后(可能)创建一个新的js.erb,这样它就不会“追加”,而是重新渲染父评论(这样才会反过来渲染新制作的儿童评论。)
我想我可能需要创建一个新的create,就像create_child一样,但是form_for变成了什么?
答案 0 :(得分:2)
自己想出来。
基本上在 comments_controller.rb 中,我必须找出新回复是否有parent_id。
def create
@item = Item.find(params[:item_id])
@all_comments = @item.comment_threads
if (params[:comment].has_key?(:parent_id))
@parent = Comment.find(params[:comment][:parent_id])
end
@comment = Comment.build_from(@item, current_user.id, params[:comment][:body])
if @comment.save
if @parent
@comment.move_to_child_of(@parent)
end
respond_to do |format|
format.js
end
else
flash.now[:error] = "Comment was not submitted."
redirect_to root_path
end
end
然后在我的 create.js.erb 里面,我需要知道它是否还有一个parent_id:
if ("<%= @comment.parent_id %>") {
$('.comment_<%= @comment.parent_id %>').append("<%= escape_javascript(render partial: 'comment', locals: { comment: @comment } ) %>");
$("#replyto_<%= @comment.parent_id %>").val('');
$("#replyto_<%= @comment.parent_id %>").toggle();
}
else {
$('#comments').append("<%= escape_javascript(render partial: 'comment', locals: { comment: @comment } ) %>");
if ("<%= @comment.body %>") {
$("#comment_body").val('');
}
}
这允许附加(通过JavaScript)子注释,并将它们放在正确的父项下。