From 2562000c2aae6c33e9b2ab7ec3f9ea09c5ab1cf1 Mon Sep 17 00:00:00 2001 From: Holger Just Date: Tue, 29 Aug 2017 19:45:19 +0200 Subject: [PATCH 3/3] Optional - Ensure that ActiveRecord::Base objects are fully serialized for mail sending --- app/models/mailer.rb | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/app/models/mailer.rb b/app/models/mailer.rb index b9de8c1b9..d38091d23 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -106,11 +106,48 @@ class Mailer < ActionMailer::Base "method*, or 3. use a custom Active Job instead of #deliver_later." else args = 'Mailer', @action.to_s, delivery_method.to_s, *@args - ::ActionMailer::DeliveryJob.set(options).perform_later(*args) + DeliveryJob.set(options).perform_later(*args) end end end + class DeliveryJob < ActionMailer::DeliveryJob + module Arguments + extend ActiveJob::Arguments + extend self + + private + + def serialize_argument(argument) + # Ensure that ActiveRecord::Base objects are fully serialized for mail + # sending. This circumvents the globalid gem for this job. + if argument.is_a?(ActiveRecord::Base) + argument.to_yaml + else + super + end + end + + def deserialize_argument(argument) + if argument.is_a?(ActiveRecord::Base) + argument + else + super + end + end + end + + private + + def serialize_arguments(serialized_args) + Arguments.serialize(serialized_args) + end + + def deserialize_arguments(serialized_args) + Arguments.deserialize(serialized_args) + end + end + def process(action, *args) user = args.shift raise ArgumentError, "First argument has to be a user, was #{user.inspect}" unless user.is_a?(User) -- 2.13.0