Na atualização, estou tentando enviar um e-mail se o valor anterior =! publicado e o novo valor é publicado. Eu tentei after_save, before_action...
se por exemplo
@ad.status == "pendente" e atualizado para 'publicado'
@ad.status_was != 'publicado' retornar verdadeiro
class Shop::AdsController < Admin2Controller
before_action :set_ad, only: %i[edit update destroy]
before_action :send_notification_if_published, only: :update
def send_notification_if_published
return unless @ad.status_was != 'published' && @ad.status_published?
notification = Notification.find_by(action: 'ad_published')
subscribed_users = User.joins(:notification_preferences)
.where(notification_preferences: { notification_id: notification.id })
subscribed_users.each do |user|
NotificationsMailer.new(user, notification, self).deliver_later
end
end
end
Em before_action
@ad
é o que você obtém deset_ad
. Ainda não foi atualizado e novosad_params
ainda não foram atribuídos. Então@ad.status
e@ad.status_was
são ambospending
.Em um controlador, você pode usar
after_action
, ou apenas colocá-lo emupdate
ação, pois precisa saber se o anúncio foi realmente atualizado com sucesso.Em um modelo
after_update
deve fazê-lo.Use
status_was
após alterar os atributos. Usestatus_previously_was
depois de salvar essas alterações.