Rails рендеринг вложенных комментариев использует нетерпеливую загрузку - PullRequest
0 голосов
/ 05 ноября 2019

Я хотел, чтобы пользователи могли добавлять комментарии к рецептам. Я также хотел, чтобы пользователи могли комментировать эти комментарии. Кажется, он работает, но, возможно, слишком много запросов происходит. Я исследовал и видел много тесно связанных статей, но, похоже, ни одна из них не помогает в решении проблемы. Независимо от того, как я изменил это, это не работает. Я могу сделать столько комментариев к комментариям, сколько захочу, но как только к рецепту будет добавлено несколько комментариев, произойдет сбой. Это как у меня может быть один или другой, но не оба, или он потерпит крах. Вот что у меня есть:

comment.rb

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
  has_many :comments, as: :commentable
end

recipe.rb

class Recipe < ApplicationRecord
  has_many :comments, as: :commentable

recipes/show.html.erb

<div class="">
  <h5>Comments:</h5>
  <div class="comment-form">
    <hr />
    <h3 class="subtitle is-3">Leave a reply</h3>
    <%= render @recipe.comments %>
  </div>
  <%= simple_form_for([@recipe, @recipe.comments.build]) do |f| %>
    <div class="field">
      <div class="control">
        <%= f.input :content, input_html: { class: 'input' }, wrapper: false, label_html: { class: 'label' } %>
      </div>
    </div>
    <%= f.button :submit, 'Leave a reply', class: "button is-primary" %>
  <% end %>
</div>

_comments.html.erb

<div class="box">
  <article class="media">
    <div class="media-content">
      <div class="content">
        <p>
          <strong><%= comment.content %></strong>
        </p>
      </div>
    </div>
  </article>
</div>
<div>
  <div class="">
    <%= form_for([comment, comment.comments.build]) do |f| %>
      <%= f.hidden_field :recipe_id, value: @recipe.id %>
      <%= f.text_area :content, placeholder: "Add a Reply" %><br/>
      <%= f.submit "Reply"  %>
    <% end %>
  </div>
  <div>
    <%= render comment.comments %>
  </div>
</div>

Если я удалю <%= render comment.comments %> Это работает, но, очевидно, не покажет мне комментарии к другим комментариям. Если я сделаю только 1 комментарий к рецепту, я могу комментировать этот комментарий столько раз, сколько захочу, без проблем. Если я добавлю еще один комментарий к рецепту, он вылетает. Если я ввожу сообщение, оно работает и показывает, что каждый комментарий присутствует, пока не будет пройден каждый комментарий, а затем вылетает. Я знаю, что для этого есть жемчужины, но я учусь и очень хотел построить с нуля и понять, что происходит. Заранее спасибо! enter image description here

1 Ответ

0 голосов
/ 15 ноября 2019

Я думаю, что если бы вы установили относительную ссылку на свою модель комментариев, это сработало бы. Вам нужно будет добавить parent_id или как вы хотите это назвать. Вы можете оставить полиморфного владельца на случай, если у вас есть другие модели, которые смогут иметь комментарии.

# Migration
def change
  add_column :comments, :parent_id, :integer, foreign_key: true
  add_index :comments, :parent_id
end

А затем в вашей модели комментариев:

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
  belongs_to :parent, class_name: 'Comment', inverse_of: :replies

  has_many :replies, foreign_key: :parent_id, class_name: 'Comment', inverse_of: :parent
end

Если вы используетеRails 5, вам нужно добавить optional: true в отношение belongs_to :parent.

...