Передача установлена ​​на method_missing (mixpanel)

В настоящее время я настраиваю mixpanel для нашего сервиса, и все работает отлично, однако я хочу передать mixpanel как method_missing, если в среде разработки/тестирования.

У меня есть это в моем application_controller.rb:

before_filter :initialize_mixpanel

def initialize_mixpanel
  if ENV.has_key?('MIXPANEL_PROJECT_TOKEN')
    @tracker = Mixpanel::Tracker.new('MIXPANEL_PROJECT_TOKEN', request.env)
  else
    @tracker = DummyMixpanel.new
  end
end

и это в моем mixpanel.rb:

unless ENV.has_key?('MIXPANEL_PROJECT_TOKEN')
  class DummyMixpanel
    def method_missing(m, *args, &block)
      true
    end
  end
end

это работает для обычного трекера, такого как @tracker.track(.. но при попытке передать ему метод .set, он возвращает NoMethodError: undefined method `set' для true:TrueClass, например, используя этот код :

@tracker.people.set(current_subscriber.id, {
  '$name'             => current_subscriber.name,
  '$email'            => current_subscriber.email,
  '$hometown'       => current_subscriber.hometown,
  '$birth_year'            => current_subscriber.birth_year,
}, ip=current_subscriber.ip);

Как бы мне лучше справиться с этим?

Всего наилучшего,


person LessPixels    schedule 14.07.2015    source источник
comment
У вашего DummyMixpanel нет метода people. Вместо этого он возвращает true (см. method_missing). true не имеет метода set, поэтому при попытке вызвать @tracker.people.set(...) возникает ошибка.   -  person Sebastian vom Meer    schedule 14.07.2015


Ответы (1)


Попробуйте вернуть self в #method_missing, например:

class DummyMixpanel
  def method_missing(m, *args, &block)
    self
  end
end

Дополнительная информация: http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/

person himynameisjonas    schedule 14.07.2015
comment
Работает отлично! Спасибо! - person LessPixels; 14.07.2015