@@ -76,7 +76,7 @@ def job_match?(job)
76
76
def arguments_match? ( job )
77
77
@args =
78
78
if @mail_args . any?
79
- base_mailer_args + @mail_args
79
+ base_mailer_args + process_arguments ( job , @mail_args )
80
80
elsif @mailer_class && @method_name
81
81
base_mailer_args + [ any_args ]
82
82
elsif @mailer_class
@@ -88,12 +88,38 @@ def arguments_match?(job)
88
88
super ( job )
89
89
end
90
90
91
+ def process_arguments ( job , given_mail_args )
92
+ # Old matcher behavior working with all builtin classes but ActionMailer::MailDeliveryJob
93
+ return given_mail_args if use_given_mail_args? ( job )
94
+
95
+ # If matching args starts with a hash and job instance has params match with them
96
+ if given_mail_args . first . is_a? ( Hash ) && job [ :args ] [ 3 ] [ 'params' ] . present?
97
+ [ hash_including ( params : given_mail_args [ 0 ] , args : given_mail_args . drop ( 1 ) ) ]
98
+ else
99
+ [ hash_including ( args : given_mail_args ) ]
100
+ end
101
+ end
102
+
103
+ def use_given_mail_args? ( job )
104
+ return true if FeatureCheck . has_action_mailer_parameterized? && job [ :job ] <= ActionMailer ::Parameterized ::DeliveryJob
105
+ return false if FeatureCheck . ruby_3_1?
106
+
107
+ !( FeatureCheck . has_action_mailer_unified_delivery? && job [ :job ] <= ActionMailer ::MailDeliveryJob )
108
+ end
109
+
91
110
def base_mailer_args
92
111
[ mailer_class_name , @method_name . to_s , MAILER_JOB_METHOD ]
93
112
end
94
113
95
114
def yield_mail_args ( block )
96
- proc { |*job_args | block . call ( *( job_args - base_mailer_args ) ) }
115
+ proc do |*job_args |
116
+ mailer_args = job_args - base_mailer_args
117
+ if mailer_args . first . is_a? ( Hash )
118
+ block . call ( *mailer_args . first [ :args ] )
119
+ else
120
+ block . call ( *mailer_args )
121
+ end
122
+ end
97
123
end
98
124
99
125
def check_active_job_adapter
@@ -120,16 +146,23 @@ def unmatching_mail_jobs_message
120
146
121
147
def mail_job_message ( job )
122
148
mailer_method = job [ :args ] [ 0 ..1 ] . join ( '.' )
123
-
124
- mailer_args = job [ :args ] [ 3 ..- 1 ]
149
+ mailer_args = deserialize_arguments ( job ) [ 3 ..- 1 ]
150
+ mailer_args = mailer_args . first [ :args ] if unified_mail? ( job )
125
151
msg_parts = [ ]
126
- msg_parts << "with #{ mailer_args } " if mailer_args . any?
152
+ display_args = display_mailer_args ( mailer_args )
153
+ msg_parts << "with #{ display_args } " if display_args . any?
127
154
msg_parts << "on queue #{ job [ :queue ] } " if job [ :queue ] && job [ :queue ] != 'mailers'
128
155
msg_parts << "at #{ Time . at ( job [ :at ] ) } " if job [ :at ]
129
156
130
157
"#{ mailer_method } #{ msg_parts . join ( ', ' ) } " . strip
131
158
end
132
159
160
+ def display_mailer_args ( mailer_args )
161
+ return mailer_args unless mailer_args . first . is_a? ( Hash ) && mailer_args . first . key? ( :args )
162
+
163
+ mailer_args . first [ :args ]
164
+ end
165
+
133
166
def legacy_mail? ( job )
134
167
job [ :job ] <= ActionMailer ::DeliveryJob
135
168
end
0 commit comments