1

開発中の Rails アプリ (v4.2) があり、ユーザーがサイトに登録したら、Mailchimp メーリング リストにサインアップしたいと思います。このプロセスは、sucker_punch と gibbon gem を使用してバックグラウンド ジョブとして実装しました。詳細はこちら ( Rails Mailchimp Background Job Not Implemented Error )

user.rb ファイルで after_commit 呼び出しを使用して動作させました。

私が今直面している唯一の問題は、メールが既に追加されているという 400 エラーで Mailchimp が応答するまで、ActiveJob がこのメソッドを何度も正常に実行するように見えることです。

ActiveJob またはこのメソッドを取得して、Mailchimp API を 1 回だけヒットさせるにはどうすればよいですか?

これが私のバックグラウンドジョブです:

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
4

1 に答える 1

2

Gibbon インターフェイスは、MailChimp API の v3 用に再度更新され、ワンライナーで「アップサート」する新しい機能があります。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これにより、メンバーが問題のリストに既に登録されている場合、コマンドがノーオペレーションであることを確認して、エラーを解決する必要があります。

于 2016-08-18T20:28:47.407 に答える