Module: Moderate::Macros
- Defined in:
- lib/moderate/macros.rb
Overview
The class-level DSL the gem adds to every ActiveRecord model.
The engine does ‘ActiveSupport.on_load(:active_record) { extend Moderate::Macros }`, so `has_reporting_and_blocking`, `has_reportable_content`, and `moderates` become class methods on ActiveRecord::Base — readable plain-English declarations that sit alongside the rest of a host’s stack (‘has_credits`, `has_wallets`, `has_api_keys`):
class User < ApplicationRecord; has_reporting_and_blocking; end
class Listing < ApplicationRecord; has_reportable_content :title, :description; end
class Message < ApplicationRecord; moderates :body, mode: :flag; end
Each macro is exact sugar for an ‘include` + a declaration — the README documents both forms as equivalent. The macros are deliberately thin: they lazily include the right concern (only models that opt in pay for it) and then forward to that concern’s declaration method. All behavior lives in the concerns, never here.
Instance Method Summary collapse
-
#has_reportable_content(*fields) ⇒ Object
‘has_reportable_content(*fields)` — mark this model as REPORTABLE content, optionally narrowing to specific fields.
-
#has_reporting_and_blocking ⇒ Object
‘has_reporting_and_blocking` — make this model an ACTOR in the Trust & Safety system: it can report content/users and block/unblock other users (report!/block!/unblock!/blocks?/blocked_by?/blocked_with?, plus the block & report associations), and — since the actor is usually itself reportable and is the be-banned target — it’s also made reportable.
-
#moderates(*fields, mode: nil, with: nil) ⇒ Object
‘moderates(*fields, mode:, with:)` — filter one or more fields before they’re saved.
Instance Method Details
#has_reportable_content(*fields) ⇒ Object
‘has_reportable_content(*fields)` — mark this model as REPORTABLE content, optionally narrowing to specific fields. Bare `has_reportable_content` (no fields) means “the whole record is reportable” (the field whitelist stays empty, and a blank reported_field is then allowed — see Reportable#reportable_field_allowed?).
Equivalent to ‘include Moderate::Reportable` + `reportable_fields(*fields)`.
55 56 57 58 59 |
# File 'lib/moderate/macros.rb', line 55 def has_reportable_content(*fields) include Moderate::Reportable unless include?(Moderate::Reportable) reportable_fields(*fields) if fields.any? self end |
#has_reporting_and_blocking ⇒ Object
‘has_reporting_and_blocking` — make this model an ACTOR in the Trust & Safety system: it can report content/users and block/unblock other users (report!/block!/unblock!/blocks?/blocked_by?/blocked_with?, plus the block & report associations), and — since the actor is usually itself reportable and is the be-banned target — it’s also made reportable. One macro, both halves.
Equivalent to ‘include Moderate::Actor`. Idempotent: re-declaring (or both macro + explicit include) won’t double-include.
44 45 46 |
# File 'lib/moderate/macros.rb', line 44 def has_reporting_and_blocking include Moderate::Actor unless include?(Moderate::Actor) end |
#moderates(*fields, mode: nil, with: nil) ⇒ Object
‘moderates(*fields, mode:, with:)` — filter one or more fields before they’re saved. ‘mode:`/`with:` default to nil so the field inherits the global `config.default_filter_mode` / `config.filter_adapter` (resolved inside `config.filter`), letting a bare `moderates :body` Just Work.
Two things happen, per field:
1. The field is registered on the model (Moderate::ContentFilterable), so
the :block validation and :flag after_commit hook run for it.
2. A Configuration FilterPolicy is recorded keyed by [class_name, field],
so `Moderate.filter_policy_for` (which the concern consults at
validate/commit time, walking the ancestor chain) can find the field's
adapter + mode. This is the exact twin of `config.filter "Class", :field,
with:, mode:` in the initializer — same storage, same resolution.
Equivalent to ‘include Moderate::ContentFilterable` + `moderates_fields(*fields)` plus the per-field policy registration.
77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/moderate/macros.rb', line 77 def moderates(*fields, mode: nil, with: nil) include Moderate::ContentFilterable unless include?(Moderate::ContentFilterable) moderates_fields(*fields) fields.each do |field| # `config.filter` normalizes/validates the adapter+mode and stores the # policy; passing `self` (the class) lets it record the class NAME string. Moderate.config.filter(self, field, with: with, mode: mode) end self end |