Rails ActiveJob后台作业保持重复Pinging Mailchimp

时间:2016-08-18 16:34:49

标签: ruby-on-rails mailchimp rails-activejob gibbon sucker-punch

我有一个rails应用程序(v4.2)我正在开发,当用户注册该网站时,我想将它们签名到我的Mailchimp邮件列表。我已经将这个过程实现为sucker_punch和gibbon gem的后台工作。在此处阅读更多内容(Rails Mailchimp Background Job Not Implemented Error

我已经使用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

1 个答案:

答案 0 :(得分:2)

对于MailChimp API的v3,Gibbon界面已经再次更新,并且有一个新的功能来{&#39; upsert&#39;在一个班轮。来自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命令为无操作来解决您的错误。