public_activity é uma grande joia para rastrear automaticamente a atividade nos registros do seu modelo, e Ryan Bates acabou de fazer um RailsCast sobre ela. Em poucas palavras, a atividade pública permite que você rastreie automaticamente cria, atualiza e destrói registros de modelo. Você também pode usá-lo para rastrear seus próprios eventos usando o método `PublicActivity :: Model # create activity`.
Estamos usando isso para rastrear visualizações de registros para que possamos rastrear quem está visualizando o quê, o que significa que os números podem ser distorcidos por bots que visitam ações do controlador que são acionadas PublicActivity::Model#create_activity
sem autenticação.
Existem várias joias que detectam bots, descobrimos que elas não são tão boas, então apenas gerencie nosso próprio método em nosso ApplicationController
. O nosso é assim, mas você pode substituí-lo pelo método de detecção de bot de sua escolha:
def is_bot? user_agent = nil
!Rails.env.test? and (user_agent or request.user_agent).match(/asynchttpclient|alexa|bot|butterfly/d.d|crawl(er|ing)|crowsnest|curl|embedly|eventmachine|facebookexternalhit|feedburner|flipboardproxy|firephp|google web preview|(^java)|LongURL|MetaURI|nagios|(^NING/d.d$)|news.me|peerindex|pingdom|postrank|(^python)|rockmeltembedservice|(^ruby$)|slurp|spider|viadeo|yahoo!|yandex/i)
end
É bastante fácil de manter, mas precisa ser revisado de vez em quando.
Assim que tivermos isso no lugar, basicamente precisamos substituir PublicActivity::Model#public_activity_enabled?
para também chamar nosso #is_bot?
método e garantir que o resultado seja falso. Poderíamos fazer um monkey patch, PublicActivity::Activity
mas pessoalmente prefiro implementar meu próprio módulo que o inclua, além de evitar um monkey patch, ele me permite definir padrões de campo personalizados em meus modelos e definir um gancho para enviar atividades para o mixpanel. Se parece com isso:
module ActiveRecord
module EventTracking
extend ActiveSupport::Concern
include PublicActivity::Model
# Override to only track if it isn't a bot
def public_activity_enabled?
PublicActivity.enabled? && (!PublicActivity.get_controller || !PublicActivity.get_controller.is_bot?)
end
end
end
Primeiro verificamos se temos um controlador, pois é inteiramente possível que nosso modelo seja iniciado fora do contexto de um controlador (testes de unidade de modelo, por exemplo) e, em seguida, perguntamos se a solicitação atual é de um bot.
Então, tudo o que resta é incluir em ActiveRecord::EventTracking
vez de PublicActivity::Model
em suas classes ActiveRecord.
Escreverei mais tarde como envio atividades para o Mixpanel e defino os valores padrão de public_activity em várias classes de modelo.