class GtmOnRails::DataLayer

Attributes

objects[RW]
objects_before_page_view[RW]

Public Class Methods

new(*args) click to toggle source
# File lib/gtm_on_rails/models/data_layer.rb, line 8
def initialize(*args)
  options  = args.extract_options!
  @objects = [args].flatten # @objects are instances of GTM::DataLayerObject

  @objects_before_page_view = []
end

Public Instance Methods

method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/gtm_on_rails/models/data_layer.rb, line 57
def method_missing(method, *args, &block)
  if @objects.respond_to?(method)
    @objects.send(method, *args, &block)
  else
    super
  end
end
print_on_html(before_page_view: false) click to toggle source
push(args, **options) click to toggle source
# File lib/gtm_on_rails/models/data_layer.rb, line 15
def push(args, **options)
  args = [args].flatten
  args.each do |object|
    case object
    when Hash
      obj = GtmOnRails::DataLayer::Object.new(object)
    when GtmOnRails::DataLayer::Object
      obj = object
    end

    if options[:before_page_view]
      @objects_before_page_view << obj
    else
      @objects << obj
    end
  end
end
respond_to?(method, include_all=false) click to toggle source
Calls superclass method
# File lib/gtm_on_rails/models/data_layer.rb, line 65
def respond_to?(method, include_all=false)
  Array.new.respond_to?(method, include_all) || super
end
to_js(before_page_view: false) click to toggle source
# File lib/gtm_on_rails/models/data_layer.rb, line 33
def to_js(before_page_view: false)
  js_codes = []

  js_codes << "var dataLayer = dataLayer || [];"

  objs = before_page_view ? @objects_before_page_view : @objects
  objs.each do |data_layer_object|
    # dataLayer size limit exception
    size = data_layer_object.to_json.bytesize
    if size > GtmOnRails.config.data_layer_limit_byte_size
      Rails.logger.warn("DataLayer bytesize is over limit #{GtmOnRails.config.data_layer_limit_byte_size} bytes. Size is #{size} bytes.")
      next
    end

    js_codes << data_layer_object.to_js
  end

  return js_codes.join.html_safe
end