不能对现有成员使用 upsert

Posted

技术标签:

【中文标题】不能对现有成员使用 upsert【英文标题】:Can't use upsert on existing member 【发布时间】:2017-01-17 01:24:56 【问题描述】:

我正在尝试使用 Gibbon 2.2.4 和我一直在使用的通用 subscribe 方法为用户订阅 Mailchimp,然后不久我想添加一些额外的字段来跟踪他们参加的测验的结果.

我想将这些数据存储在 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。我在这里更新的字段的值是无关紧要的,但我认为它们很有解释性。当我尝试在 send_quiz_results 中运行我的 upsert 语句时,我收到以下错误:

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 动词。

我不知道为什么这不起作用...我尝试删除其他字段,只是简单地放入我正在更新的字段。我还尝试直接从终端运行它,以确保没有重叠。

【问题讨论】:

你能告诉我你是怎么知道的吗? but the extracted source for the error references my upsert statement.“提取的错误源”是什么意思? 因为这是错误显示的行。我想我应该更清楚一点,只是说 upsert 调用位于跟踪的顶部。 我还明确地直接从终端调用 upsert 以确认它没有尝试进行成员创建。虽然它似乎仍然在做一个 POST 什么的...... @Doug 我也有同样的问题,你能找到问题的根源吗? 尚无解决方案。我只是决定不使用 MailChimp。 【参考方案1】:

MailChimp API docs表示更新会员时必须提供会员的subscriber_hash,即会员邮箱地址小写的MD5哈希值。

使用Digest::MD5.hexdigest 用MD5 对电子邮件地址进行哈希处理:

GIBBON.lists(list_id).members(Digest::MD5.hexdigest(email.downcase)).upsert

【讨论】:

在我的情况下我使用 md5 哈希

以上是关于不能对现有成员使用 upsert的主要内容,如果未能解决你的问题,请参考以下文章

群组成员支持的协议与现有成员的协议不兼容

C++ 成员函数作为外部库的回调函数

不能对不可变值使用变异成员:“父”是“让”常量? [关闭]

MailChimp API - 无法更新现有成员的标签

不能对不可变值使用变异成员:函数调用返回不可变值 - 不确定为啥值是不可变的

Mailchimp API 向新成员和现有成员添加标签