Как мне перечислить только один экземпляр каждого комментария? - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть панель администратора, которая берет комментарии со всех постов в блоге и перечисляет их, чтобы мне было легче управлять ими.Проблема в том, что он показывает второй экземпляр комментариев, оставленных в качестве ответа, что делает его немного загроможденным.Как я могу остановить это от перечисления ответов дважды?Это не проблема, когда они отображаются в виде поста.

Как я вызываю список в моем представлении user.show:

<%= render(partial: 'comments/comment', collection: @comments) %>

users_controller (show method): @comments = Comment.all

_comment.html.erb part:

<div class="wellington top-drop">
  <h3 class="title-top align-left"><%=h comment.name %><% if comment.admin_comment == true %><span class="text-muted"> | Admin</span><% end %></h3>
  <% if current_user.present? && current_user.admin? %>
  <%= link_to "Delete", comment, method: :delete,
                                  data: { confirm: "Are you sure you want to delete this comment? This will delete all replies to this comment." },
                                  class: "btn btn-xs btn-danger align-right" %>
  <p class="align-right text-muted pad-right"><%= comment.updated_at.strftime('%b %d, %Y') %></p>
  <% end %>
  <div style="clear: both;"></div>
  <p class="nobot align-left"><%=h comment.body %></p> <!-- the h breaks down html tags into plain text -->
  <button type="button" class="btn btn-xs btn-success align-right" data-toggle="collapse" data-target="<%= "#collapse#{comment.id}" %>" aria-expanded="false" aria-controls="<%= "collapse#{comment.id}" %>">Reply</button>
  <div style="clear: both;"></div>
  <div class="collapse" id="<%= "collapse#{comment.id}" %>">
    <%= simple_form_for([comment, Comment.new]) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
      <%= f.input :body, :as => :text, input_html: { maxlength: 300 }, label: false, placeholder: "What are your thoughts?", class: "form-control", wrapper_html: { id: 'contactTextarea' } %>
      <%= f.input :name, label: false, placeholder: "Name (required) - Just your first name is okay too!", class: "form-control" %>
      <%= f.input :email, label: false, placeholder: "Email Address (required) - This is not displayed with the comment", class: "form-control" %>
      <div class="form-group hidden">
        <%= f.input :nickname, :hint => "leave this field blank!", class: "form-control" %>
      </div>
      <%= f.submit "Reply", class: "btn btn-success" %>
    <% end %>
  </div>
</div>

<ul>
  <%= render partial: 'comments/comment', collection: comment.comments %>
</ul>

Вот как это выглядит:

enter image description here

РЕДАКТИРОВАТЬ: У меня нет этой проблемы при отображении их в представлении их соответствующего сообщения - только когда оно отображается в пользовательскомshow view.

Я обрабатываю свои комментарии через полиморфное отношение:

CommentsController:

before_action :find_commentable

private

def find_commentable
  @commentable = Comment.find_by_id(params[:comment_id]) if params[:comment_id]
  @commentable = Post.friendly.find(params[:post_id]) if params[:post_id]
end

Модель комментариев:

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
  belongs_to :user, optional: true
  has_many :comments, as: :commentable, dependent: :destroy
  default_scope {order(created_at: :asc)}
  attribute :nickname, :captcha  => true
  validates :body, presence: true, length: { minimum: 3, maximum: 300 }
  validates :name, presence: true, length: { minimum: 2, maximum: 30 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 100 },
                    format: { with: VALID_EMAIL_REGEX }

  def admin_comment
    user&.admin
  end

end

Ответы [ 2 ]

0 голосов
/ 23 января 2019

После некоторого тестирования я смог перечислить свои комментарии только один раз, используя это в моем users_controller:

@comments   = Comment.where(commentable_type: "Post")

Вместо этого:

@comments   = Comment.all

Это только перечисленные комментариикоторые принадлежали посту, но также позволяли размещать под ними комментарии, принадлежащие другому комментарию (в качестве ответа).

0 голосов
/ 01 декабря 2018

Если вы не хотите, чтобы дочерние комментарии выглядели так, как если бы они были комментариями верхнего уровня, вам нужно удалить их из вашей коллекции @comments перед обработкой ваших частичных данных.Вы по-прежнему визуализируете дочерние комментарии с помощью

<%= render partial: 'comments/comment', collection: comment.comments %>

, поэтому не нужно отображать их как комментарии верхнего уровня.

Вместо

@comments   = Comment.all

Попробуйте

@comments = Comment.where(comment_id: nil)

Вероятно, лучше всего поместить что-то подобное в модель, поэтому возможно:

class Comment < ApplicationRecord
  scope :top_level, -> { where(comment_id: nil) }
  ....
end

И в вашем контроллере:

@comments = Comment.top_level

РЕДАКТИРОВАТЬ: Это предполагает комментариииметь comment_id, чтобы установить родительский комментарий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...