不能在现有成员上使用upsert

问题描述:

我试图用Gibbon 2.2.4订阅用户到Mailchimp,并使用我一直使用的通用subscribe方法,然后在我想添加一些额外字段以追踪结果他们参加了一个测验。不能在现有成员上使用upsert

我想将这些数据存储在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="[email protected] 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"=>"[email protected] 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\":\"[email protected] is already a list member. Use PUT to insert or update list members.\",\"instance\":\"\"}", 
@status_code=400 

我不知道为什么它不会让我做这件事......这好像它引用create声明,但提取的错误来源引用我的upsert语句。

我知道我使用长臂猿相应PUT动词,因为下面是直接取自文档:

当然,身体只支持创建,更新和更新插入电话。那些分别映射到HTTP POST,PATCH和PUT动词。

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

+0

你能告诉我你是怎么知道的? '但错误的提取源引用了我的upsert语句。“你提到的”错误提取源“是什么意思? –

+1

因为这是错误显示的行。我想我应该已经更清楚了,只是说upsert调用位于跟踪的顶部。 – Doug

+0

我也明确直接从终端调用upsert来确认它没有尝试执行成员*创建*。虽然它似乎仍然在做POST或其他什么...... – Doug

MailChimp API docs表明在更新成员时,您必须提供成员的subscriber_hash,这是成员电子邮件地址的小写版本的MD5散列。

使用Digest::MD5.hexdigest散列与MD5的电子邮件地址:

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

在我的情况下即时通讯使用md5散列 –

+2

oops,downcase为我做了诡计 –