私が使用してきた一般的な方法を使用して、 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 動詞にマップされます。
これが機能しない理由がわかりません...他のフィールドを取り出して、更新しているフィールドを単に投入してみました。また、ターミナルから直接実行して、何も重複していないことを確認しました。