3

私が使用してきた一般的な方法を使用して、 Gibbon 2.2.4でユーザーを Mailchimp にサブスクライブしようとしてsubscribeいます。その後すぐに、いくつかのフィールドを追加して、彼らが取ったクイズの結果を追跡したいと考えています。

Mailchimp のダッシュボードから直接送信するメールを管理したいので、このデータを Mailchimp に保存したいと考えています。

サブスクリプションを処理するために作成したサービス:

class MailchimpService

  def subscribe(list_id,email,first_name)
    GIBBON.lists(list_id).members.create({
      body: {
        email_address: email,
        status: 'subscribed',
        merge_fields: {
          FNAME: first_name,
        },
        double_optin: false,
        update_existing: true
      }
    })
  end

  def subscribe_to_quiz(first_name, email, user_id, quiz_id)
    list_id = ENV['QUIZ_MAILCHIMP_LIST_ID']
    if subscribe(list_id,email,first_name)
      attempt = QuizAttempt.where("user_id = ? AND quiz_id = ?", user_id, quiz_id).last
      correct = attempt.correct_answer_count
      total = attempt.questions_answered
      successful = attempt.successful?
      send_quiz_results(list_id, email, correct, total, successful)
    end
  end

  def send_quiz_results(list_id, email, correct, total, successful)
    GIBBON.lists(list_id).members(email).upsert(
      body: {
        email_address: email,
        status: 'subscribed',
        merge_fields: {
          correct_answers: correct,
          total_answers: total,
          successful: successful
        },
        update_existing: true
    })
  end
end

ではsubscribe_to_quiz、ユーザーを Mailchimp の quiz_list に登録しています。ここで更新しているフィールドの値は無関係ですが、かなり説明的だと思います。で upsert ステートメントを実行しようとするとsend_quiz_results、次のエラーが表示されます。

the server responded with status 400 
@title="Member Exists", 
@detail="foo@bar.baz is already a list member. Use PUT to insert or update list members.", 
@body={"type"=>"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/", "title"=>"Member Exists", "status"=>400, "detail"=>"foo@bar.baz is already a list member. Use PUT to insert or update list members.", "instance"=>""}, 
@raw_body="{\"type\":\"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/\",\"title\":\"Member Exists\",\"status\":400,\"detail\":\"foo@bar.baz is already a list member. Use PUT to insert or update list members.\",\"instance\":\"\"}", 
@status_code=400

なぜこれができないのかわかりません...createステートメントを参照しているようですが、エラーの抽出されたソースは私のupsertステートメントを参照しています。

以下はドキュメントからそのまま引用されているため、Gibbon に対応する PUT 動詞を使用していることはわかっています。

もちろん、body は create、update、および upsert 呼び出しでのみサポートされています。これらは、それぞれ HTTP POST、PATCH、および PUT 動詞にマップされます。

これが機能しない理由がわかりません...他のフィールドを取り出して、更新しているフィールドを単に投入してみました。また、ターミナルから直接実行して、何も重複していないことを確認しました。

4

1 に答える 1

6

MailChimp API ドキュメントは、メンバーを更新するときに、メンバーのメール アドレスの小文字バージョンの MD5 ハッシュである、メンバーのsubscriber_hash を提供する必要があることを示しています。

Digest::MD5.hexdigestMD5 で電子メール アドレスをハッシュするために使用します。

GIBBON.lists(list_id).members(Digest::MD5.hexdigest(email.downcase)).upsert
于 2016-10-03T18:43:40.840 に答える