Properly fire update_email hook after commit which changes user email
This commit is contained in:
parent
f0582c25bf
commit
a49f5c7f72
2 changed files with 57 additions and 2 deletions
50
app/models/concerns/track_saved_changes.rb
Normal file
50
app/models/concerns/track_saved_changes.rb
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
# https://github.com/ccmcbeck/after-commit
|
||||
module TrackSavedChanges
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
# expose the details if consumer wants to do more
|
||||
attr_reader :saved_changes_history, :saved_changes_unfiltered
|
||||
after_initialize :reset_saved_changes
|
||||
after_save :track_saved_changes
|
||||
end
|
||||
|
||||
# on initalize, but useful for fine grain control
|
||||
def reset_saved_changes
|
||||
@saved_changes_unfiltered = {}
|
||||
@saved_changes_history = []
|
||||
end
|
||||
|
||||
# filter out any changes that result in the original value
|
||||
def saved_changes
|
||||
@saved_changes_unfiltered.reject { |k,v| v[0] == v[1] }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# on save
|
||||
def track_saved_changes
|
||||
# maintain an array of ActiveModel::Dirty.changes
|
||||
@saved_changes_history << changes.dup
|
||||
# accumulate the most recent changes
|
||||
@saved_changes_history.last.each_pair { |k, v| track_saved_change k, v }
|
||||
end
|
||||
|
||||
# v is an an array of [prev, current]
|
||||
def track_saved_change(k, v)
|
||||
if @saved_changes_unfiltered.key? k
|
||||
@saved_changes_unfiltered[k][1] = track_saved_value v[1]
|
||||
else
|
||||
@saved_changes_unfiltered[k] = v.dup
|
||||
end
|
||||
end
|
||||
|
||||
# type safe dup inspred by http://stackoverflow.com/a/20955038
|
||||
def track_saved_value(v)
|
||||
begin
|
||||
v.dup
|
||||
rescue TypeError
|
||||
v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -82,7 +82,12 @@ class User < ApplicationRecord
|
|||
|
||||
after_create_commit :mailbluster_create_lead
|
||||
after_destroy_commit :mailbluster_delete_lead
|
||||
after_update_commit :mailbluster_update_email, if: :saved_change_to_email?
|
||||
# Note that because a commit may cause multiple changes
|
||||
# which are not fully tracked by ActiveRecord::Dirty,
|
||||
# we must resort to using a ActiveRecord::Concern which accumulates
|
||||
# changes from a commit (app/models/concerns/track_saved_changes.rb)
|
||||
# See https://github.com/ccmcbeck/after-commit
|
||||
after_update_commit :mailbluster_update_email, if: ->(obj){ obj.saved_changes.key? 'email' }
|
||||
|
||||
# add scope
|
||||
scope :comment_notifiable, ->(conference) {joins(:roles).where('roles.name IN (?)', [:organizer, :cfp]).where('roles.resource_type = ? AND roles.resource_id = ?', 'Conference', conference.id)}
|
||||
|
|
@ -386,7 +391,7 @@ class User < ApplicationRecord
|
|||
|
||||
def mailbluster_update_email
|
||||
# FIXME: May fail if multiple saves occur in one commit
|
||||
MailblusterEditLeadJob.perform_later(self, old_email: email_before_last_save)
|
||||
MailblusterEditLeadJob.perform_later(self, old_email: self.saved_changes['email'][0])
|
||||
end
|
||||
|
||||
def touch_events
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue