Skip to content

Instantly share code, notes, and snippets.

@yamitake
Created August 15, 2025 06:53
Show Gist options
  • Select an option

  • Save yamitake/6ad626170793ba91c37b9ed682e60be5 to your computer and use it in GitHub Desktop.

Select an option

Save yamitake/6ad626170793ba91c37b9ed682e60be5 to your computer and use it in GitHub Desktop.
Rails concern for queueing analytics events in flash and rendering them once per tab as dataLayer.push(...) calls guarded by sessionStorage to prevent duplicates.
# app/controllers/concerns/track_events.rb
module TrackEvents
extend ActiveSupport::Concern
included do
helper_method :render_data_layer_events
delegate :tag, to: :view_context, private: true
end
def data_layer_events = flash[:data_layer_events] ||= []
def track_event(event_name, parameters = {}) = data_layer_events << { event: event_name, **parameters }
def render_data_layer_events
events = data_layer_events
return if events.empty?
javascript_code = [
"window.dataLayer=window.dataLayer||[];",
*events.map { |event_data|
key = "dl_#{event_data.hash}"
"if(!sessionStorage.getItem(#{key.to_json})){dataLayer.push(#{event_data.to_json});sessionStorage.setItem(#{key.to_json},'1');}"
}
].join
tag.script(javascript_code.html_safe)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment