В моем приложении есть система многопоточных комментариев.Я использую 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 ... Любым способом, которым я могу это сделать ???