1

我有一個正在開發的Rails應用程序(v4.2),當用戶註冊該站點時,我想將它們簽署到我的Mailchimp郵件列表中。我用sucker_punch和長臂猿寶石作爲後臺工作實施了這個過程。在這裏閱讀更多(Rails Mailchimp Background Job Not Implemented ErrorRails ActiveJob後臺作業重複Pinging Mailchimp

我已經得到它在user.rb文件中使用after_commit調用。

我現在遇到的唯一問題是,似乎ActiveJob會一次又一次地成功執行此方法,直到Mailchimp迴應400錯誤,該錯誤已添加電子郵件。

我怎樣才能得到ActiveJob或這種方法只打一次Mailchimp API?

這裏是我的後臺作業:

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 
+0

工作是否有機會提出異常並重試? – pdoherty926

+0

似乎沒有任何異常提出,除了有關使用'find'的棄用警告 – JohnOHFS

+0

您應該改變您對長臂猿的使用,以首先檢查相關用戶是否已被添加到列表中。 –

回答

2

長臂猿接口已經爲MailChimp API的V3再次更新,並有新的能力'upsert'在一個班輪中。從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"}}) 

爲了獲得哈希,此代碼應工作:

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

這應該確保upsert命令解決您的錯誤是一個空操作,如果該成員已訂閱有問題的列表。

+0

「lower_case_md5_hashed_email_address」的用途是什麼?我在哪裏放置該行代碼?我假設我也需要Digest寶石? – JohnOHFS

+0

@JohnOHFS推測,這就是MailChimp如何最快速地唯一標識電子郵件地址。摘要是Ruby標準庫的一部分;你可以在你引用它的文件頂部需要'摘要'。 –