These lines of code go in the layout view for the pages that will be logged. They include the needed javascript code that responds to logged events.
<%= javascript_include_tag 'page_timings' %> <%= javascript_tag "var AUTH_TOKEN = #{form_authenticity_token.inspect};" if protect_against_forgery? %>
This is the javascript code that is loaded from the include line in the layout view.
# add authenticity token to Ajax requests $(document).ajaxSend(function(event, request, settings) { if (typeof(AUTH_TOKEN) == "undefined") return; // settings.data is a serialized string like "foo=bar&baz=boink" (or null) settings.data = settings.data || ""; settings.data += (settings.data ? "&" : "") + "authenticity_token=" + encodeURIComponent(AUTH_TOKEN); }); $(function() { # execute when page is "ready" loadTime = (new Date).getTime(); pageID = $("body")[0].id; $.post('/pages/event', {time:loadTime, page:pageID, event:"load"}); # register click handler for all page links $("a").click(function (event) { clickTime = (new Date).getTime() - loadTime; targetID = event.target.id; $.post('/pages/event', {time:clickTime, page:targetID, event:"click"}); }) });
The event controller action is called when a page is loaded (ready) and when a user clicks on a link. It logs the event by putting a record in the database.
def event # set start time if it is nil if ! @utask.start @utask.start = Time.now @utask.save end ua = UserAction.new ua.user_task_id = @utask.id ua.page_id = params[:page] ua.time = params[:time] ua.title = params[:event] ua.save if params[:event] == "click" and (params[:page] == @utask.page_id.to_s or Time.now - @utask.start > 180) # reached the end, go to end of task method @utask.finish = Time.now @utask.save end render :text => "OK" end