mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-01-20 23:37:52 -05:00
This commit introduces a blocking feature that allows members to block other members. A blocked member is prevented from: - following the blocker - sending private messages to the blocker - replying to the blocker's posts - liking the blocker's content The implementation includes: - A new `Block` model and a corresponding database table. - Updates to the `Member` model to include associations for blocks. - A new `BlocksController` to handle blocking and unblocking actions. - New routes for the `BlocksController`. - UI changes to add block/unblock buttons to the member profile page. - Validations in the `Follow`, `Comment`, and `Like` models to enforce the blocking rules. - A check in the `MessagesController` to prevent sending messages to a member who has blocked the sender. - A callback in the `Block` model to destroy the follow relationship when a block is created. - New feature and model specs to test the blocking functionality. This commit also fixes a failing test in the blocking feature. The error was caused by the validation being called even when the `member` association was `nil`. A guard has been added to the validation methods in the `Like`, `Follow`, and `Comment` models to prevent this from happening.
39 lines
1.0 KiB
Ruby
39 lines
1.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Comment < ApplicationRecord
|
|
belongs_to :author, class_name: 'Member', inverse_of: :comments
|
|
belongs_to :commentable, polymorphic: true, counter_cache: true
|
|
# validates :body, presence: true
|
|
validate :author_is_not_blocked
|
|
|
|
scope :post_order, -> { order(created_at: :asc) } # for display on post page
|
|
|
|
after_create do
|
|
recipient = commentable.author.id
|
|
sender = author.id
|
|
# don't send notifications to yourself
|
|
if recipient != sender
|
|
Notification.create(
|
|
recipient_id: recipient,
|
|
sender_id: sender,
|
|
subject: "#{author} commented on #{commentable.subject}",
|
|
body:,
|
|
notifiable: commentable
|
|
)
|
|
end
|
|
end
|
|
|
|
def to_s
|
|
"#{author.login_name} commented on #{commentable.subject}"
|
|
end
|
|
|
|
private
|
|
|
|
def author_is_not_blocked
|
|
return unless author
|
|
if commentable.author.already_blocking?(author)
|
|
errors.add(:base, "You cannot comment on a post of a member who has blocked you.")
|
|
end
|
|
end
|
|
end
|