我正在构建一个reddit克隆(仅用于练习))并且表单存在新评论回复问题。我使用this教程来构建多态注释,一切正常但我想在回复下添加新注释回复的表单,以便您单击链接并显示表单(带有表单的div被隐藏默认)。但似乎我在表单中生成的每个新对象都会显示该表单,因此它只是无限循环。有没有办法为评论回复创建表单?
这是我的_form:
= form_for comment do |f|
p
= f.label :body
= f.text_area :body
= f.hidden_field :link_id, value: params[:link_id]
- if params[:link_id]
= hidden_field_tag :link_id, params[:link_id]
- if params[:comment_id]
= hidden_field_tag :comment_id, params[:comment_id]
= f.submit "Create", class: "button tiny"
_comment partial:
li.comment
p = comment.body
p = link_to "Add a reply", "", class: "reply_link"
.comment_form
= render 'comments/form', comment: comment.comments.build
- unless comment.comments.empty?
ul.comments_list
= render partial: 'comments/comment', collection: comment.comments
答案 0 :(得分:1)
我使用以下jQuery解决了这个问题。
$(document).ready(function() {
$('.partner-area').click(function() {
$(this).next('.partner-offices').slideToggle(500);
});
});
上面的地方,.partner-area
是要点击的链接的类,.partner-offices
是我的表单的类名。这基本上是说当点击任何链接时,下一个表单将动画并打开。
表单display: hidden
答案 1 :(得分:1)
所以,解决方案非常简单。我决定使用AJAX来动态构建表单,而不是为每个注释渲染表单(这将非常慢)。 这是_comment视图:
- if comment.id && comment.user
li id="comment-#{comment.id}" class="comment"
h6 = "From #{link_to comment.user.email, user_path(comment.user)}".html_safe
.comment_body
= comment.body
= render 'shared/likes_panel', object: comment
= link_to "Reply",
new_comment_path(comment_id: comment.id),
remote: true
.comment_form
- unless comment.comments.empty?
= render 'comments/list', comments: comment.comments
正如您所看到的,在link_to中我使用 remote:true ,它指向comments_controller中应该响应js的 new 操作:
def new
@comment = @parent.comments.new
@comment.user = current_user
respond_to do |format|
format.js
end
end
最后,您需要new.js.erb将评论表单附加到正确的评论中:
var li = $("#comment-<%= params[:comment_id] %>");
li.find(".comment_form").html("<%= j render 'comments/form' %>");
只要您在<ul>
中发表评论,所有子评论都会很好地缩进!