Best Practice - Counter / Zugriffszähler in Ruby on Rails

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Best Practice - Counter / Zugriffszähler in Ruby on Rails

    Ich möchte die Umsetzung ein paar typischer Probleme/Funktionalitäten in Ruby on Rails diskutieren und gemeinsam mit euch eine Art Best Practice finden. Vielleicht kann man das ganze dann im Wiki dokumentieren. Anfangen möchte ich mit dem altbekannten Counter oder Zugriffszähler.

    Ausgangssituation: Der Kunde möchte, dass erkennbar wird, wie viele Besucher seine Homepage hat.

    Lösungskonzept: Es sind verschieden granulare Stufen denkbar. Der Einfachheit halber wird der Ansatz gewählt, dass eine IP pro Tag einmal gezählt wird. Darüber hinaus werden Browser-Agent und die aufgerufene Seite gespeichert.

    Umsetzung: Benötigt werden ein Model visit, ein PagesController (zum Verwalten von Seiten) und ein paar wenige Helper

    1. Model erzeugen

    Quellcode

    1. script/generate model visit

    2. Migrations anpassen

    Quellcode

    1. class CreateVisits < ActiveRecord::Migration
    2. def self.up
    3. create_table :visits do |t|
    4. t.string :ip
    5. t.string :referrer
    6. t.string :browser_agent
    7. t.string :page
    8. t.timestamps
    9. end
    10. end
    11. def self.down
    12. drop_table :visits
    13. end
    14. end
    Alles anzeigen

    3. DB migrieren

    Quellcode

    1. rake db:migrate

    4. PagesController erstellen (zuvor page-Model erstellen)
    Der Controller nutzt dabei einen before_filter um vor jedem Seitenaufruf das Zählen durchzuführen.

    Quellcode

    1. class PagesController < ApplicationController
    2. before_filter :write_statistics
    3. # ... andere Logik
    4. protected
    5. def write_statistics
    6. # Suche nach Einträgen von heute mit passender IP und Browser Agent
    7. visit = Visit.find(:first, :conditions =>{
    8. :ip => request.remote_ip.to_s,
    9. :browser_agent => request.env['HTTP_USER_AGENT'],
    10. :updated_at => DateTime.now.beginning_of_day..DateTime.now.end_of_day
    11. })
    12. if visit.nil?
    13. # eintrag existiert noch nicht -> anlegen, fertig
    14. v = Visit.new({
    15. :ip => request.remote_ip.to_s,
    16. :browser_agent => request.env['HTTP_USER_AGENT'],
    17. :page => "#{params[:controller]}/#{params[:action]}",
    18. :referrer => request.env['HTTP_REFERRER']
    19. })
    20. # Logging
    21. logger.error "Fehler beim Speichern eines Visits" unless v.save
    22. end
    23. end
    24. end
    Alles anzeigen

    5. Helper anlegen

    Quellcode

    1. module PagesHelper
    2. def visitors_today
    3. v = Visit.find(:all, :conditions => {
    4. :updated_at => DateTime.now.beginning_of_day..DateTime.now.end_of_day
    5. })
    6. v.size
    7. end
    8. # day as DateTime
    9. def visitors_on day
    10. v = Visit.find(:all, :conditions => {
    11. :updated_at => day.beginning_of_day..day.end_of_day
    12. })
    13. v.size
    14. end
    15. def visitors_total
    16. Visit.count
    17. end
    18. end
    Alles anzeigen

    Offene Fragen / Kritik:
    • Performance/Skalierung
    • Erweiterung der Kontrolle -> Welche Parameter können noch sinnvoll geprüft werden?
    • Erweiterte Speicherung denkbar: Speichern jedes Seitenbesuchs
      • Vorteile: Besseres Tracking möglich, speziellere Statistiken
      • Nachteile: Schnell sehr viele Datensätze in der DB -> Archivierung? ander Lösung?
    • Welche Daten sind noch interessant?

    Ich dokumentiere diese Lösung aktuell auf meinem Blog und werde es dort auch immer wieder aktualisieren. Diskutieren lässt sich hier natürlich viel besser =)

    Ich bin gespannt auf eure Ideen...