diff --git a/CHANGELOG.md b/CHANGELOG.md index 43516654e..ea24dcb28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Register the Active Record and Action View integrations when the gem is required, instead of from the railtie initializer - Add a top-level `null` option to the `add_monetize`/`monetize` migration helpers (#775) +- Fix `MoneyRails::ActiveJob::MoneySerializer` not being registered on Rails 8.1+, and on older versions without eager loading (#779) ## 3.0.0 diff --git a/lib/money-rails/hooks.rb b/lib/money-rails/hooks.rb index 178fa2ed6..bc8e009b9 100644 --- a/lib/money-rails/hooks.rb +++ b/lib/money-rails/hooks.rb @@ -37,15 +37,10 @@ def self.init require "money-rails/mongoid/money" end - # For ActiveSupport - ActiveSupport.on_load(:active_job) do - if defined?(::ActiveJob::Serializers) - require "money-rails/active_job/money_serializer" - Rails.application.config.active_job.tap do |config| - config.custom_serializers ||= [] - config.custom_serializers << MoneyRails::ActiveJob::MoneySerializer - end - end + # For Active Job + if defined?(::ActiveJob::Serializers) + require "money-rails/active_job/money_serializer" + ::ActiveJob::Serializers.add_serializers(MoneyRails::ActiveJob::MoneySerializer) end end end diff --git a/spec/active_job/money_serializer_spec.rb b/spec/active_job/money_serializer_spec.rb index 439d597d7..743e304e8 100644 --- a/spec/active_job/money_serializer_spec.rb +++ b/spec/active_job/money_serializer_spec.rb @@ -25,5 +25,13 @@ describe "#deserialize" do it { expect(described_class.deserialize(serialized_money)).to eq(money) } end + + describe "Active Job registration" do + it "round-trips Money through Active Job argument serialization" do + serialized = ActiveJob::Arguments.serialize([money]) + + expect(ActiveJob::Arguments.deserialize(serialized)).to eq([money]) + end + end end end diff --git a/spec/dummy/config/application.rb b/spec/dummy/config/application.rb index 2a5357c0e..a5bb7045d 100644 --- a/spec/dummy/config/application.rb +++ b/spec/dummy/config/application.rb @@ -4,6 +4,14 @@ require "logger" require "active_record/railtie" unless ENV["BUNDLE_GEMFILE"]&.include?("mongoid") +# The Mongoid gemfiles depend on Action Pack only, not the full rails gem, so the +# activejob gem may be unavailable. Load it only when present (the serializer specs +# are guarded by `defined?(ActiveJob::Serializers)`). +begin + require "active_job/railtie" +rescue LoadError + nil +end require "action_controller/railtie" Bundler.require