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标准库的一部分;你可以在你引用它的文件顶部需要'摘要'。 –