Module: ConcernsOnRails

Defined in:
lib/concerns_on_rails.rb,
lib/concerns_on_rails/railtie.rb,
lib/concerns_on_rails/version.rb,
lib/concerns_on_rails/encryption.rb,
lib/concerns_on_rails/configuration.rb,
lib/concerns_on_rails/support/money.rb,
lib/concerns_on_rails/legacy_aliases.rb,
lib/concerns_on_rails/support/masker.rb,
lib/concerns_on_rails/models/hashable.rb,
lib/concerns_on_rails/models/lockable.rb,
lib/concerns_on_rails/models/maskable.rb,
lib/concerns_on_rails/models/sortable.rb,
lib/concerns_on_rails/models/storable.rb,
lib/concerns_on_rails/models/taggable.rb,
lib/concerns_on_rails/models/aliasable.rb,
lib/concerns_on_rails/models/auditable.rb,
lib/concerns_on_rails/models/expirable.rb,
lib/concerns_on_rails/models/sluggable.rb,
lib/concerns_on_rails/models/stateable.rb,
lib/concerns_on_rails/models/duplicable.rb,
lib/concerns_on_rails/models/searchable.rb,
lib/concerns_on_rails/support/encryptor.rb,
lib/concerns_on_rails/models/activatable.rb,
lib/concerns_on_rails/models/addressable.rb,
lib/concerns_on_rails/models/encryptable.rb,
lib/concerns_on_rails/models/monetizable.rb,
lib/concerns_on_rails/models/publishable.rb,
lib/concerns_on_rails/models/sanitizable.rb,
lib/concerns_on_rails/models/schedulable.rb,
lib/concerns_on_rails/models/tokenizable.rb,
lib/concerns_on_rails/models/anonymizable.rb,
lib/concerns_on_rails/models/normalizable.rb,
lib/concerns_on_rails/models/sequenceable.rb,
lib/concerns_on_rails/controllers/sortable.rb,
lib/concerns_on_rails/support/address_data.rb,
lib/concerns_on_rails/support/column_guard.rb,
lib/concerns_on_rails/support/random_value.rb,
lib/concerns_on_rails/support/scalar_param.rb,
lib/concerns_on_rails/support/unique_retry.rb,
lib/concerns_on_rails/controllers/cacheable.rb,
lib/concerns_on_rails/models/soft_deletable.rb,
lib/concerns_on_rails/controllers/filterable.rb,
lib/concerns_on_rails/controllers/includable.rb,
lib/concerns_on_rails/support/error_envelope.rb,
lib/concerns_on_rails/controllers/localizable.rb,
lib/concerns_on_rails/controllers/paginatable.rb,
lib/concerns_on_rails/controllers/respondable.rb,
lib/concerns_on_rails/support/html_sanitizers.rb,
lib/concerns_on_rails/controllers/authorizable.rb,
lib/concerns_on_rails/controllers/deprecatable.rb,
lib/concerns_on_rails/controllers/throttleable.rb,
lib/concerns_on_rails/controllers/timezoneable.rb,
lib/concerns_on_rails/models/counter_cacheable.rb,
lib/concerns_on_rails/controllers/idempotentable.rb,
lib/concerns_on_rails/controllers/secure_headable.rb,
lib/concerns_on_rails/support/sequence_calculator.rb,
lib/concerns_on_rails/controllers/error_handleable.rb,
lib/concerns_on_rails/controllers/cursor_paginatable.rb,
lib/concerns_on_rails/controllers/webhook_verifiable.rb,
lib/concerns_on_rails/support/filter_parameter_registry.rb

Defined Under Namespace

Modules: Controllers, Encryption, Models, Support Classes: Configuration, MissingDependency, Railtie

Constant Summary collapse

VERSION =
"1.24.0".freeze
LEGACY_MODEL_ALIASES =

Backwards-compatibility aliases for pre-1.6 module paths, resolved lazily: eager Sluggable = Models::Sluggable assignments would force-load every concern file at boot and defeat the loader's autoload laziness. The first reference to ConcernsOnRails::<Name> loads the real module and pins the alias constant, so include ConcernsOnRails::Sluggable works unchanged. New code is encouraged to use the namespaced form: ConcernsOnRails::Models::Sluggable.

Note Sortable resolves to Models::Sortable (as it always has) — the controller concern is only reachable as Controllers::Sortable.

%i[
  Sluggable Sortable Publishable SoftDeletable Hashable Schedulable
  Expirable Normalizable Searchable Activatable Tokenizable Stateable
  Addressable Sequenceable Taggable Sanitizable Maskable Monetizable
  Auditable Lockable Aliasable Storable CounterCacheable Encryptable
  Anonymizable Duplicable
].freeze

Class Method Summary collapse

Class Method Details

.configObject

Gem-wide configuration (see Configuration), set from an initializer:

ConcernsOnRails.setup do |config|
config.cache_store = -> { Rails.cache }
end


111
112
113
# File 'lib/concerns_on_rails.rb', line 111

def self.config
  @config || @config_mutex.synchronize { @config ||= Configuration.new }
end

.configure_encryption {|encryption| ... } ⇒ Object

Yields:



130
131
132
133
134
135
136
# File 'lib/concerns_on_rails.rb', line 130

def self.configure_encryption
  yield encryption if block_given?
  # Purge PBKDF2-derived keys built from the previous configuration; purely
  # memory hygiene (a changed key/salt is a different cache entry anyway).
  Support::Encryptor.reset_key_cache!
  encryption
end

.const_missing(name) ⇒ Object



20
21
22
23
24
25
26
# File 'lib/concerns_on_rails/legacy_aliases.rb', line 20

def self.const_missing(name)
  return super unless LEGACY_MODEL_ALIASES.include?(name)

  # Idempotent under a concurrent first reference: both threads pin the
  # same module object, and once pinned const_missing never fires again.
  const_set(name, Models.const_get(name))
end

.deprecatorObject

Gem-wide deprecator backing alias_association ..., deprecated: (and any future deprecation surface). A dedicated instance — not the global ActiveSupport::Deprecation singleton, whose direct use is itself deprecated on Rails 7.1+. Default behavior prints to $stderr; Rails apps can re-route it (e.g. config.active_support.deprecation style):

ConcernsOnRails.deprecator.behavior = :log


100
101
102
103
104
# File 'lib/concerns_on_rails.rb', line 100

def self.deprecator
  @deprecator || @config_mutex.synchronize do
    @deprecator ||= ActiveSupport::Deprecation.new("2.0", "concerns_on_rails")
  end
end

.encryptionObject

Gem-wide encryption configuration backing Models::Encryptable. Memoized like deprecator; the host app supplies the key (see ConcernsOnRails::Encryption):

ConcernsOnRails.configure_encryption do |c|
c.key = -> { Rails.application.credentials.dig(:encryption, :key) }
end


126
127
128
# File 'lib/concerns_on_rails.rb', line 126

def self.encryption
  @encryption || @config_mutex.synchronize { @encryption ||= Encryption::Config.new }
end

.filter_parameter_registryObject

Live registry of sensitive field names (populated by Models::Encryptable) consulted at filter time by the proc ConcernsOnRails::Railtie appends to config.filter_parameters.



141
142
143
144
145
# File 'lib/concerns_on_rails.rb', line 141

def self.filter_parameter_registry
  @filter_parameter_registry || @config_mutex.synchronize do
    @filter_parameter_registry ||= Support::FilterParameterRegistry.new
  end
end

.setup {|config| ... } ⇒ Object

Yields:



115
116
117
118
# File 'lib/concerns_on_rails.rb', line 115

def self.setup
  yield config if block_given?
  config
end