Фоновое задание Rails ActiveJob постоянно пингует Mailchimp

У меня есть приложение rails (v4.2), которое я разрабатываю, и когда пользователь регистрируется на сайте, я хочу подписать его в своем списке рассылки Mailchimp. Я реализовал этот процесс как фоновую работу с sucker_punch и gibbon gem. Подробнее здесь ( ошибка фонового задания Rails Mailchimp не реализована)

У меня это работает, используя вызов after_commit в файле user.rb.

Единственная проблема, с которой я сейчас сталкиваюсь, это то, что ActiveJob будет успешно выполнять этот метод снова и снова, пока Mailchimp не ответит 400 ошибкой, что электронное письмо уже было добавлено.

Как я могу получить ActiveJob или этот метод только один раз поразить API Mailchimp?

Вот моя справочная работа:

class AddUserToRegistrationListJob < ActiveJob::Base
 queue_as :default
 require 'gibbon'

def perform(user_id)
    user = User.find(user_id)
    email = user.email
    first_name = user.first_name
    last_name = user.last_name

    mailchimp_list_id = "my list id here"
    Gibbon::Request.api_key = "my api key here"
    Gibbon::Request.timeout = 15
    gibbon = Gibbon::Request.new

    gibbon.lists("#{mailchimp_list_id}").members.create(
        body: 
        {
            email_address: email, 
            status: "subscribed", 
            merge_fields: {FNAME: first_name, LNAME: last_name
                }})
end
end

Мой файл user.rb:

after_create :add_user_to_registration_list

def add_user_to_registration_list
   AddUserToRegistrationListJob.perform_later(self)
end

1 ответ

Решение

Интерфейс Gibbon был снова обновлен для v3 API MailChimp, и появилась новая возможность " вставлять" в одну строку. Из RubyDoc:

If you want to upsert instead, you would do the following:

 gibbon.lists(list_id).members(lower_case_md5_hashed_email_address).upsert(body: {email_address: "foo@bar.com", status: "subscribed", merge_fields: {FNAME: "First Name", LNAME: "Last Name"}})

Чтобы получить хеш, этот код должен работать:

require 'digest'
lower_case_md5_hashed_email_address = Digest::MD5.new.update(email.downcase).hexdigest

Это должно устранить вашу ошибку, обеспечив upsert Команда запрещена, если участник уже подписан на данный список.

Другие вопросы по тегам