不能在现有成员上使用upsert

Dou*_*oug 3 ruby-on-rails http mailchimp gibbon

我正在尝试使用我一直在使用的通用方法使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它不会让我这样做...似乎它引用了一个create语句,但提取的错误源引用了我的upsert语句.

我知道我正在为Gibbon使用相应的PUT动词,因为以下内容直接来自文档:

当然,body仅支持create,update和upsert调用.它们分别映射到HTTP POST,PATCH和PUT动词.

我不知道为什么这不起作用...我已经尝试取出其他领域,只是简单地扔掉我正在更新的那些.我也试过从终端直接运行它以确保没有任何重叠.

inf*_*sed 6

MailChimp API文档显示,更新的成员时,必须提供会员的subscriber_hash,其成员电子邮件地址的小写版本的MD5哈希值.

用于使用Digest::MD5.hexdigestMD5哈希电子邮件地址:

GIBBON.lists(list_id).members(Digest::MD5.hexdigest(email.downcase)).upsert
Run Code Online (Sandbox Code Playgroud)