1

Ich habe eine Rails-App (v4.2) Ich entwickle und wenn ein Benutzer für die Website registriert, möchte ich sie in meine Mailchimp Mailing-Liste anmelden. Ich habe diesen Prozess als Hintergrundjob mit sucker_punch und dem Gibbon-Juwel implementiert. Lesen Sie hier mehr (Rails Mailchimp Background Job Not Implemented Error)Rails ActiveJob Hintergrund Job hält Pinging Mailchimp wiederholt

Ich habe es funktioniert mit einem After_commit Aufruf in der User.RB-Datei.

Nur das Problem, in das ich jetzt renne, scheint es, dass ActiveJob diese Methode immer wieder erfolgreich ausführt, bis Mailchimp mit einem 400-Fehler antwortet, dass die E-Mail bereits hinzugefügt wurde.

Wie bekomme ich ActiveJob oder diese Methode, um nur die Mailchimp API einmal zu treffen?

Hier ist mein Hintergrund Job:

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 

Meine user.rb Datei:

after_create :add_user_to_registration_list 

def add_user_to_registration_list 
    AddUserToRegistrationListJob.perform_later(self) 
end 
+0

Besteht die Möglichkeit, dass der Job eine Ausnahme auslöst und erneut versucht wird? – pdoherty926

+0

Es scheint keine Ausnahmen zu geben, ausgenommen eine verwarnte Warnung zur Verwendung von 'find' – JohnOHFS

+0

Sie sollten Ihre Verwendung von Gibbon ändern, um zuerst zu prüfen, ob der betreffende Benutzer bereits zur Liste hinzugefügt wurde. –

Antwort

2

Die Gibbon-Schnittstelle wieder für v3 der MailChimp API aktualisiert worden ist, und es gibt eine neue Fähigkeit zu 'upsert' in einem einzigen Liner. Von den 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: "[email protected]", status: "subscribed", merge_fields: {FNAME: "First Name", LNAME: "Last Name"}}) 

den Hash zu erwerben, sollte dieser Code funktionieren:

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

Dies sollte Ihre Fehler beheben, indem Sie den upsert Befehl sicherzustellen, ist ein no-op, wenn das Mitglied bereits abonniert wird die Liste in Frage.

+0

Was ist der Zweck der "lower_case_md5_hashed_email_address" und wo gebe ich diese Codezeile ein? Ich nehme an, ich brauche auch das Digest-Juwel? – JohnOHFS

+0

@JohnOHFS Vermutlich kann MailChimp so am schnellsten E-Mail-Adressen eindeutig identifizieren. Digest ist ein Teil der Ruby-Standardbibliothek; Sie können "Digest" am Anfang der Datei anfordern, in der Sie darauf verweisen. –

Verwandte Themen