4

Gibbon gem を使用して MailChimp 経由でニュースレターにサインアップする Rails 4.2 アプリがあります。

ここに私のイニシャライザがあります:

Gibbon::Request.api_key = ENV['MAILCHIMP_API_KEY']
Gibbon::Request.timeout = 15
Gibbon::Request.throws_exceptions = false

user.rb の関連するメソッドは次のとおりです。

  # returns the mailchimp member if one exists for @user.email
  def mailchimp_user
    gb = Gibbon::Request.new(api_key: ENV['MAILCHIMP_API_KEY'])
    gb.lists(ENV['MAILCHIMP_LIST_ID']).members(Digest::MD5.hexdigest("#{self.email.downcase}")).retrieve
    rescue Gibbon::MailChimpError => e
    return nil, :flash => { error: e.message }
  end

  def mailchimp_member_id
    if self.mailchimp_user.kind_of?(Array)
      return nil
    elsif self.mailchimp_user.kind_of?(Hash)
      self.mailchimp_user["id"]
    end
  end

  # returns the mailChimp status of the user  
  def mailchimp_status
    if self.mailchimp_user.kind_of?(Array)
      return nil
    elsif self.mailchimp_user.kind_of?(Hash)
      self.mailchimp_user["status"]
    end
  end

  # syncs Mailchimp status to EBW, subscribing and unsubscribing users as appropriate. potential MC status includes
  # 'subscribed', 'unsubscribed', 'pending' and 'cleaned'
  def add_to_mailchimp
    gb = Gibbon::Request.new(api_key: ENV['MAILCHIMP_API_KEY'])
    if self.subscribed? # if the user has checked the "subscribed" checkbox
      if self.mailchimp_status.present? # if MailChimp recognizes the email address
        gb.lists(ENV['MAILCHIMP_LIST_ID']).members(Digest::MD5.hexdigest("#{self.email.downcase}")).update(body: { status: "subscribed" }) #subscribe user 
      elsif self.mailchimp_status.nil? # if MailChimp doesn't have a user for the email address
        gb.lists(ENV['MAILCHIMP_LIST_ID']).members.create(body: { # create a MailChimp pending subscriber
          email_address: "#{self.email}",
          status: "pending", # setting this to 'subscribed' will remove double optin
          merge_fields: {FNAME: "#{self.name}"}
          })
      end

  # unsubscribe user if box is unchecked but mailchimp has user as subscribed or pending
    else
      unless self.mailchimp_user.kind_of?(Array)
        gb.lists(ENV['MAILCHIMP_LIST_ID']).members(self.mailchimp_member_id).update(body: { status: "unsubscribed" })  
      end
    end
  end

私はまだ Rspec を学んでおり、Gibbon::MailChimp のコンテキストに適用するのに苦労しています。ユーザーの現在のステータスに基づいて、購読と購読解除が期待どおりに機能することをテストしたいと思います。たとえば、購読を解除したユーザーは、MailChimp で購読を作成する必要がある新しい購読者とは異なる扱いを受けます。

4

0 に答える 0