Rails多态评论

时间:2016-01-24 14:42:08

标签: ruby-on-rails forms polymorphic-associations

我正在构建一个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

2 个答案:

答案 0 :(得分:1)

我使用以下jQuery解决了这个问题。

$(document).ready(function() {
    $('.partner-area').click(function() {
        $(this).next('.partner-offices').slideToggle(500);
    });
});

上面的地方,.partner-area是要点击的链接的类,.partner-offices是我的表单的类名。这基本上是说当点击任何链接时,下一个表单将动画并打开。

表单display: hidden

上的默认css

答案 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>中发表评论,所有子评论都会很好地缩进!