Как создать уведомления для ответов на комментарии? - PullRequest
0 голосов
/ 28 мая 2019

В моем приложении есть система многопоточных комментариев.Я использую https://github.com/rails-engine/notifications/ для уведомления при создании комментария.Как создать уведомления также для ответов на комментарии?

Это то, что я сделал для уведомления на один комментарий

comment.rb

belongs_to :commentable, polymorphic: true
belongs_to :user
belongs_to :parent, class_name: 'Comment', optional: true
has_many :replies, class_name: 'Comment', foreign_key: :parent_id, dependent: :destroy

  validates :content, presence: true, length: { maximum: 255 }

  after_commit :notify_comment_created, on: [:create]
  def notify_comment_created
    return if self.commentable.blank?
    receiver_id = self.commentable&.user_id

    Notification.create(
      notify_type: "comment",
      target: self,
      second_target: self.commentable,
      actor_id: self.user_id,
      user_id: receiver_id
    )
  end

notifications / comment.html.erb

<% if notification.second_target.is_a?(Article) %>
    <div class=''>
      <p class="notifications-p"><i class="fa fa-comment text-secondary"></i> <b><%= link_to notification.actor.username, main_app.profile_path(notification.actor.username) %></b> commented on your <b><%= notification.second_target.class.name %>:</b> <b><%= link_to notification.second_target.title, main_app.article_path(notification.second_target) %></b></p>
    </div>

    <div class=''>
      <p class="notifications-p"><i><%= truncate(notification.target.content, length: 100) %></i></p>
    </div>
  <% elsif notification.second_target.is_a?(Announcement) %>
    <div class=''>
      <p class="notifications-p"><i class="fa fa-comment text-secondary"></i> <b><%= link_to notification.actor.username, main_app.profile_path(notification.actor.username) %></b> commented on your <b><%= notification.second_target.class.name %>:</b> <b><%= link_to notification.second_target.title, main_app.announcement_path(notification.second_target) %></b></p>
    </div>

    <div class=''>
      <p class="notifications-p"><i><%= truncate(notification.target.content, length: 100) %></i></p>
    </div>
<% end %>

comment_table в схеме

create_table "comments", force: :cascade do |t|
    t.string "commentable_type"
    t.bigint "commentable_id"
    t.bigint "user_id"
    t.text "content"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "parent_id"
    t.index ["commentable_type", "commentable_id"], name: "index_comments_on_commentable_type_and_commentable_id"
    t.index ["parent_id"], name: "index_comments_on_parent_id"
    t.index ["user_id"], name: "index_comments_on_user_id"
end

_comment.html.erb

...
<li id="comment_<%= comment.id %>" class="comment">
   <%= link_to "Reply", polymorphic_path([:reply, comment.commentable, comment]), class: 'reply-comment-link', remote: true  %>
  <% if comment.replies.any? %>
    <ul>
      <%= render comment.replies %>
    </ul>
  <% end %>
</li>

reply.js.erb

<% if @comment.errors.empty? %>
  $("#comment_<%= @comment.id %> > .comment-info .reply-comment-link").removeAttr("href");
  $("#comment_<%= @comment.id %> > .comment-info").after("<%=j render('comments/form', comment: @reply) %>");
...
<% end %>

В настоящее время, если на комментарий получен ответ, self.commentable получает уведомление об ответе как новый комментарий.В общем, я хочу, чтобы комментарий. Пользователь получал уведомление как ответ.

ОБНОВЛЕНИЕ:

Я сделал, как предложено ниже, я добавил if (messages.target.parent.present?) {..... text as reply ....} else {... ваш текущий код ...} в представлении уведомлений?

Теперь, что яДалее необходимо изменить reciever_id в зависимости от того, присутствует ли на странице уведомлений Notification.target.parent.Если это так, я бы хотел оставить его как в моей модели комментариев, я бы изменил reciever_id на comment.parent.user ... Любым способом, которым я могу это сделать ???

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