不能对现有成员使用 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的主要内容,如果未能解决你的问题,请参考以下文章