Module: Doorkeeper::OpenidConnect::Orm::ActiveRecord::AccessGrantExtension
- Defined in:
- lib/doorkeeper/openid_connect/orm/active_record.rb
Overview
Prepended onto the singleton class of Doorkeeper’s AccessGrant mixin so that every model which includes ‘Doorkeeper::Orm::ActiveRecord::Mixins::AccessGrant` — the default `Doorkeeper::AccessGrant` as well as any (possibly namespaced) custom access grant model — also gains the OpenID Connect `openid_request` association.
The association is wired from the mixin’s ‘included` callback, at the moment the host model is loaded: `base` is the model class itself, handed to us by Ruby. Nothing reaches out to constantize the configured grant class, so the re-entrant `ActiveSupport.on_load(:active_record)` window that broke namespaced custom models is gone.
Background: doorkeeper-openid_connect v1.10.0 (#241) wrapped the grant-model prepend in ‘ActiveSupport.on_load(:active_record)`, following doorkeeper #1804. doorkeeper later reverted that in #1830 (v5.9.2) because the hook fires while `ActiveRecord::Base` is first loaded — e.g. mid-evaluation of `class ApplicationRecord < ActiveRecord::Base` — at which point constantizing `Auth::OAuthAccessGrant < ApplicationRecord` raises `NameError: uninitialized constant Auth::ApplicationRecord` (#306). We follow the same fix: wire from the mixin instead of on_load.
Instance Method Summary collapse
Instance Method Details
#included(base) ⇒ Object
39 40 41 42 43 44 45 |
# File 'lib/doorkeeper/openid_connect/orm/active_record.rb', line 39 def included(base) super # `base` is a Module (not the model) when the mixin is included # into an intermediate ActiveSupport::Concern; the concern defers # the include, so this hook fires again with the model class. base.prepend(OpenidConnect::AccessGrant) if base.is_a?(Class) end |