From 2a8b9f4105af5fc9fc2f4d098405ebe3065222e8 Mon Sep 17 00:00:00 2001 From: Fabian Mersch Date: Tue, 22 May 2018 15:06:06 +0200 Subject: [PATCH 1/2] Eager load modules on boot Using ActiveModelSerializers with a threaded web server eg. Puma uninitialized constant errors are thrown. Leaving this article for reference: http://blog.plataformatec.com.br/2012/08/eager-loading-for-greater-good/. --- lib/active_model/serializer.rb | 22 ++++++++------- lib/active_model_serializers.rb | 28 ++++++++++++------- .../adapter/json_api.rb | 18 ++++++------ lib/active_model_serializers/railtie.rb | 2 ++ 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index b5b95736..b6b7be88 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -18,16 +18,18 @@ module ActiveModel # @see #serializable_hash for more details on these valid keys. SERIALIZABLE_HASH_VALID_KEYS = [:only, :except, :methods, :include, :root].freeze extend ActiveSupport::Autoload - autoload :Adapter - autoload :Null - autoload :Attribute - autoload :Association - autoload :Reflection - autoload :SingularReflection - autoload :CollectionReflection - autoload :BelongsToReflection - autoload :HasOneReflection - autoload :HasManyReflection + eager_autoload do + autoload :Adapter + autoload :Null + autoload :Attribute + autoload :Association + autoload :Reflection + autoload :SingularReflection + autoload :CollectionReflection + autoload :BelongsToReflection + autoload :HasOneReflection + autoload :HasManyReflection + end include ActiveSupport::Configurable include Caching diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 6e5c5962..4f4623ff 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -5,16 +5,19 @@ require 'active_support/core_ext/string/inflections' require 'active_support/json' module ActiveModelSerializers extend ActiveSupport::Autoload - autoload :Model - autoload :Callbacks - autoload :Deserialization - autoload :SerializableResource - autoload :Logging - autoload :Test - autoload :Adapter - autoload :JsonPointer - autoload :Deprecate - autoload :LookupChain + eager_autoload do + autoload :Model + autoload :Callbacks + autoload :SerializableResource + autoload :SerializationContext + autoload :Logging + autoload :Test + autoload :Adapter + autoload :JsonPointer + autoload :Deprecate + autoload :LookupChain + autoload :Deserialization + end class << self; attr_accessor :logger; end self.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) @@ -46,6 +49,11 @@ module ActiveModelSerializers $VERBOSE = original_verbose end + def self.eager_load! + super + ActiveModel::Serializer.eager_load! + end + require 'active_model/serializer/version' require 'active_model/serializer' require 'active_model/serializable_resource' diff --git a/lib/active_model_serializers/adapter/json_api.rb b/lib/active_model_serializers/adapter/json_api.rb index b225416b..592a9e9e 100644 --- a/lib/active_model_serializers/adapter/json_api.rb +++ b/lib/active_model_serializers/adapter/json_api.rb @@ -22,14 +22,16 @@ module ActiveModelSerializers module Adapter class JsonApi < Base extend ActiveSupport::Autoload - autoload :Jsonapi - autoload :ResourceIdentifier - autoload :Relationship - autoload :Link - autoload :PaginationLinks - autoload :Meta - autoload :Error - autoload :Deserialization + eager_autoload do + autoload :Jsonapi + autoload :ResourceIdentifier + autoload :Link + autoload :PaginationLinks + autoload :Meta + autoload :Error + autoload :Deserialization + autoload :Relationship + end def self.default_key_transform :dash diff --git a/lib/active_model_serializers/railtie.rb b/lib/active_model_serializers/railtie.rb index d6843c9c..260bf8c2 100644 --- a/lib/active_model_serializers/railtie.rb +++ b/lib/active_model_serializers/railtie.rb @@ -5,6 +5,8 @@ require 'action_controller/serialization' module ActiveModelSerializers class Railtie < Rails::Railtie + config.eager_load_namespaces << ActiveModelSerializers + config.to_prepare do ActiveModel::Serializer.serializers_cache.clear end From 65313b901bd8c79862538a4edf9fcea2479fc0cd Mon Sep 17 00:00:00 2001 From: Fabian Mersch Date: Tue, 22 May 2018 16:48:27 +0200 Subject: [PATCH 2/2] Remove obsolete autoloads --- lib/active_model/serializer.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index b6b7be88..f6567a70 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -24,8 +24,6 @@ module ActiveModel autoload :Attribute autoload :Association autoload :Reflection - autoload :SingularReflection - autoload :CollectionReflection autoload :BelongsToReflection autoload :HasOneReflection autoload :HasManyReflection