我想开始从我们的后端发送谷歌分析事件,因为可以通过各种不同的方式、不同的控制器、不同的模板和UI创建新记录。跟踪在代码的公共点创建的新项目是有意义的,这些项目都必须经过。
但要做到这一点,我需要为每个用户提供一个clientId
,它来自谷歌分析客户端javascript。
class MyModel
after_create :create_analytics_event
def create_analytics_event
GoogleAnalytics.event('foo', 'bar', client_id)
# ^ how do I get this in here
end
end
问题是,我不想从所有将创建这些记录的控制器中显式传递此信息。
过去,我把它们粘在一个全局对象上,比如:
class ApplicationController < ActionController::Base
before_filter :set_current_ga_client_id
after_filter :clear_current_ga_client_id
def set_current_ga_client_id
User.current_ga_client_id = session[:ga_client_id]
end
def clear_current_ga_client_id
User.current_ga_client_id = nil
end
end
但这感觉像是对单线程假设的滥用。
有没有更好的方法可以含蓄地做到这一点?或者这样做只是一个坏主意?
我选择了一个around过滤器,它看起来有点干净。
# in ApplicationController
around_filter :set_backend_analytics_client_id
def set_backend_analytics_client_id
GoogleAnalyticsApi.current_ga_client_id = session[:ga_client_id]
yield
GoogleAnalyticsApi.current_ga_client_id = nil
end
这似乎至少更清楚地说明了发生了什么。