Rails:为服务器端模型回调获取客户端数据



我想开始从我们的后端发送谷歌分析事件,因为可以通过各种不同的方式、不同的控制器、不同的模板和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

这似乎至少更清楚地说明了发生了什么。

最新更新