From 06c6a100cea3a09d6ef1f8e264a13dc783a71ac2 Mon Sep 17 00:00:00 2001 From: rulingcom Date: Wed, 29 Jul 2026 16:17:05 +0800 Subject: [PATCH] Add click tracking for banner links --- app/controllers/ad_banners_controller.rb | 11 ++++++++++- app/controllers/admin/ad_banners_controller.rb | 2 +- app/controllers/admin/ad_images_controller.rb | 2 +- app/models/ad_image.rb | 1 + app/views/admin/ad_banners/show.html.erb | 3 ++- config/locales/zh_tw.yml | 3 ++- config/routes.rb | 1 + 7 files changed, 18 insertions(+), 5 deletions(-) diff --git a/app/controllers/ad_banners_controller.rb b/app/controllers/ad_banners_controller.rb index 313f38d..ba9f8a2 100644 --- a/app/controllers/ad_banners_controller.rb +++ b/app/controllers/ad_banners_controller.rb @@ -1,4 +1,5 @@ class AdBannersController < ApplicationController + skip_before_action :verify_authenticity_token, only: [:track_click] def self.custom_widget_data ac = ActionController::Base.new ac.instance_variable_set(:@custom_data_field, @custom_data_field) @@ -15,6 +16,14 @@ class AdBannersController < ApplicationController end end + def track_click + ad_image = AdImage.find(params[:id]) + ad_image.inc(click_count: 1) + head :ok + rescue Mongoid::Errors::DocumentNotFound + head :not_found + end + private def image_widget(adbanner) @@ -34,7 +43,7 @@ class AdBannersController < ApplicationController target = "" end if !b.out_link.blank? - image_link += "\" style=\"cursor:pointer;\" onload=\"var el=this;(function(){if((el.parentElement==undefined||el.parentElement.tagName!='A')&&$('

'+$(el).parents('.w-ba-banner__slide').eq(0).attr('data-overlay-template')+'

').find('a').length==0){el.outerHTML=(''+el.outerHTML+'');}})()\"" + image_link += "\" style=\"cursor:pointer;\" onclick=\"if(navigator.sendBeacon){navigator.sendBeacon('/ad_banners/track_click/#{b.id}');}\" onload=\"var el=this;(function(){if((el.parentElement==undefined||el.parentElement.tagName!='A')&&$('

'+$(el).parents('.w-ba-banner__slide').eq(0).attr('data-overlay-template')+'

').find('a').length==0){el.outerHTML=(''+el.outerHTML+'');}})()\"" end context = (b.context.tr('"',"'") rescue "") images << { diff --git a/app/controllers/admin/ad_banners_controller.rb b/app/controllers/admin/ad_banners_controller.rb index 5284e00..19c641c 100644 --- a/app/controllers/admin/ad_banners_controller.rb +++ b/app/controllers/admin/ad_banners_controller.rb @@ -24,7 +24,7 @@ class Admin::AdBannersController < OrbitAdminController else @images = @banner.ad_images.not_expired.order_by(is_top: -1, sort_number: 1).page(params[:page]).per(10) end - @table_fields = [:banner, :title, "ad_banner.duration", :link] + @table_fields = [:banner, :title, "ad_banner.duration", :link, "click_count"] end def new diff --git a/app/controllers/admin/ad_images_controller.rb b/app/controllers/admin/ad_images_controller.rb index ec3a822..2fe0072 100644 --- a/app/controllers/admin/ad_images_controller.rb +++ b/app/controllers/admin/ad_images_controller.rb @@ -60,4 +60,4 @@ class Admin::AdImagesController < Admin::AdBannersController def setup_vars @module_app = ModuleApp.where(:key => "ad_banner").first end -end \ No newline at end of file +end diff --git a/app/models/ad_image.rb b/app/models/ad_image.rb index fd0cb94..a006fea 100644 --- a/app/models/ad_image.rb +++ b/app/models/ad_image.rb @@ -22,6 +22,7 @@ class AdImage field :is_top, :type => Boolean, :default => false field :language_enabled, :type => Array, :default => ["en","zh_tw"] field :exchange_item, :default => "1" + field :click_count, type: Integer, default: 0 LINK_OPEN_TYPES = ["local", "new_window"] belongs_to :banner diff --git a/app/views/admin/ad_banners/show.html.erb b/app/views/admin/ad_banners/show.html.erb index 0267d4d..13df73a 100644 --- a/app/views/admin/ad_banners/show.html.erb +++ b/app/views/admin/ad_banners/show.html.erb @@ -94,7 +94,8 @@ <% if image.out_link != "" %> " target="_blank">Link <% end %> - + + <%= image.click_count %> <% end %> diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 0869d9c..7f95af1 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -46,4 +46,5 @@ zh_tw: type: 圖片 或 影片 choose_type: 請先選擇類型 select: 請選擇 - video: 影片 \ No newline at end of file + click_count: "點擊次數" + video: 影片 diff --git a/config/routes.rb b/config/routes.rb index 93aeba2..f0c19fc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,7 @@ Rails.application.routes.draw do require 'fileutils' get 'ad_banners/widget' +post 'ad_banners/track_click/:id', to: 'ad_banners#track_click', as: 'ad_banner_track_click' if ENV['worker_num']=='0' && File.basename($0) != 'rake' && !Rails.const_defined?('Console') Thread.new do s = Site.first