Полиморфные комментарии Rails

Я создаю клон Reddit (просто для практики)) и у меня проблема с формой для ответа на новый комментарий. Я использовал этот учебник. для создания полиморфных комментариев, и все работает нормально, но я хочу добавить формы для новых ответов на комментарии прямо под ответом, чтобы вы нажимали ссылку и появлялась форма (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:

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

person poctek    schedule 24.01.2016    source источник


Ответы (2)


Я решил эту проблему с помощью следующего jQuery.

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

Где выше .partner-area — это класс ссылки, по которой нужно щелкнуть, а .partner-offices — это имя класса моей формы. По сути, это означает, что при нажатии любой ссылки будет анимирована и открыта следующая форма.

CSS по умолчанию для формы display: hidden

person RuNpiXelruN    schedule 25.01.2016
comment
Спасибо, хоть это и не совсем то, что я искал, но вы натолкнули меня на идею использовать ajax для отрисовки формы) - person poctek; 26.01.2016
comment
О рад это слышать! Я хотел бы увидеть ваше решение для моего собственного образования, если бы вы могли опубликовать его?! Спасибо - person RuNpiXelruN; 27.01.2016
comment
Добавьте ответ, надеюсь, он будет полезен) - person poctek; 30.01.2016

Итак, решение было довольно простым. Вместо рендеринга форм для каждого комментария, что было бы довольно медленно, я решил использовать 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, что указывает на действие new в comment_controller, которое должно реагировать на js:

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>, все подкомментарии будут иметь хороший отступ!

person poctek    schedule 30.01.2016