mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-01-03 06:57:50 -05:00
This change introduces polymorphic comments, allowing you to comment on Photos, Plantings, Harvests, and Activities, in addition to Posts.
Key changes include:
- **Comment Model:**
- Made `Comment.commentable` a polymorphic association.
- Added a data migration to move existing post comments to the new structure.
- Updated notification creation logic for polymorphic commentables.
- **CommentsController:**
- Refactored to handle various commentable types using a `find_commentable` method.
- **Ability Model:**
- Updated permissions for comment creation, editing (author/admin), and deletion (author/commentable owner/admin).
- **Routes:**
- Added nested comment routes for Photos, Plantings, Harvests, Activities, and Posts using a `commentable` concern with shallow routes.
- **Views:**
- Created generic partials for comment forms (`_form.html.haml`) and display (`_comment.html.haml`, `_comments.html.haml`).
- Integrated these partials into the show pages of all commentable types.
- Updated `comments/new` and `comments/edit` views to be generic.
- Relevant parent controller `show` actions now eager-load comments.
- **Testing:**
- Added extensive model, controller (using shared examples), and feature tests to cover the new polymorphic comment functionality, including permissions and UI interactions for all commentable types.
- Updated and created factories as needed.
This fulfills the issue requirements for adding comments to multiple resource types with appropriate permissions.
26 lines
749 B
Ruby
26 lines
749 B
Ruby
# frozen_string_literal: true
|
|
|
|
class Notification < ApplicationRecord
|
|
belongs_to :sender, class_name: 'Member', inverse_of: :sent_notifications
|
|
belongs_to :recipient, class_name: 'Member', inverse_of: :notifications
|
|
belongs_to :commentable, polymorphic: true, optional: true
|
|
|
|
validates :subject, length: { maximum: 255 }
|
|
|
|
scope :unread, -> { where(read: false) }
|
|
scope :by_recipient, ->(recipient) { where(recipient_id: recipient) }
|
|
|
|
before_create :replace_blank_subject
|
|
after_create :send_message
|
|
|
|
def send_message
|
|
sender.send_message(recipient, body, subject) if recipient.send_notification_email
|
|
end
|
|
|
|
private
|
|
|
|
def replace_blank_subject
|
|
self.subject = "(no subject)" if subject.nil? || subject =~ /^\s*$/
|
|
end
|
|
end
|