diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index 49455169..901653af 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -31,8 +31,7 @@ module ActionController serializable_resource.serialization_scope ||= serialization_scope serializable_resource.serialization_scope_name = _serialization_scope begin - serializable_resource.adapter - serializable_resource + serializable_resource.tap(&:adapter) rescue ActiveModel::Serializer::CollectionSerializer::NoSerializerError resource end diff --git a/lib/active_model/serializable_resource.rb b/lib/active_model/serializable_resource.rb index d016adae..c91eea17 100644 --- a/lib/active_model/serializable_resource.rb +++ b/lib/active_model/serializable_resource.rb @@ -4,6 +4,11 @@ module ActiveModel ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key, :links]) include ActiveModelSerializers::Logging + delegate :serializable_hash, :as_json, :to_json, to: :adapter + notify :serializable_hash, :render + notify :as_json, :render + notify :to_json, :render + # Primary interface to composing a resource with a serializer and adapter. # @return the serializable_resource, ready for #as_json/#to_json/#serializable_hash. def initialize(resource, options = {}) @@ -12,24 +17,6 @@ module ActiveModel options.partition { |k, _| ADAPTER_OPTION_KEYS.include? k }.map { |h| Hash[h] } end - def serializable_hash(*args) - run_callbacks :render do - adapter.serializable_hash(*args) - end - end - - def as_json(*args) - run_callbacks :render do - adapter.as_json(*args) - end - end - - def to_json(*args) - run_callbacks :render do - adapter.to_json(*args) - end - end - def serialization_scope=(scope) serializer_opts[:scope] = scope end diff --git a/lib/active_model/serializer/railtie.rb b/lib/active_model/serializer/railtie.rb index f6c2d27c..533a191c 100644 --- a/lib/active_model/serializer/railtie.rb +++ b/lib/active_model/serializer/railtie.rb @@ -1,4 +1,3 @@ -require 'active_model_serializers' require 'rails/railtie' module ActiveModel diff --git a/lib/active_model_serializers/logging.rb b/lib/active_model_serializers/logging.rb index e80fb5d5..6a1ede89 100644 --- a/lib/active_model_serializers/logging.rb +++ b/lib/active_model_serializers/logging.rb @@ -2,14 +2,39 @@ # Adapted from: # https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb module ActiveModelSerializers::Logging - extend ActiveSupport::Concern + def self.included(base) + base.send(:include, ActiveSupport::Callbacks) + base.extend ClassMethods + base.class_eval do + define_callbacks :render + around_render do |_, block| + notify_active_support do + block.call + end + end + end + end - included do - extend ActiveModel::Callbacks - define_model_callbacks :render - around_render do |_, block, _| - notify_active_support do - block.call + module ClassMethods + def around_render(*filters, &blk) + set_callback(:render, :around, *filters, &blk) + end + ## + # Simple notify method that wraps up +name+ + # in a dummy method. It notifies on each call to the dummy method + # telling what the current serializer and adapter are being rendered. + # Adapted from: + # https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb + + def notify(name, callback_name) + class_eval do + old = "_notifying_#{callback_name}_#{name}" + alias_method old, name + define_method name do |*args, &block| + run_callbacks callback_name do + send old, *args, &block + end + end end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 6495d251..dc466864 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -50,6 +50,7 @@ if ENV['CAPTURE_STDERR'] !~ /false|1/i end require 'active_model_serializers' +require 'active_model/serializer/railtie' require 'support/stream_capture'