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
2. Migrations anpassen
Alles anzeigen
3. DB migrieren
4. PagesController erstellen (zuvor page-Model erstellen)
Der Controller nutzt dabei einen before_filter um vor jedem Seitenaufruf das Zählen durchzuführen.
Alles anzeigen
5. Helper anlegen
Alles anzeigen
Offene Fragen / Kritik:
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...
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
2. Migrations anpassen
Quellcode
3. DB migrieren
4. PagesController erstellen (zuvor page-Model erstellen)
Der Controller nutzt dabei einen before_filter um vor jedem Seitenaufruf das Zählen durchzuführen.
Quellcode
- class PagesController < ApplicationController
- before_filter :write_statistics
- # ... andere Logik
- protected
- def write_statistics
- # Suche nach Einträgen von heute mit passender IP und Browser Agent
- visit = Visit.find(:first, :conditions =>{
- :ip => request.remote_ip.to_s,
- :browser_agent => request.env['HTTP_USER_AGENT'],
- :updated_at => DateTime.now.beginning_of_day..DateTime.now.end_of_day
- })
- if visit.nil?
- # eintrag existiert noch nicht -> anlegen, fertig
- v = Visit.new({
- :ip => request.remote_ip.to_s,
- :browser_agent => request.env['HTTP_USER_AGENT'],
- :page => "#{params[:controller]}/#{params[:action]}",
- :referrer => request.env['HTTP_REFERRER']
- })
- # Logging
- logger.error "Fehler beim Speichern eines Visits" unless v.save
- end
- end
- end
5. Helper anlegen
Quellcode
- module PagesHelper
- def visitors_today
- v = Visit.find(:all, :conditions => {
- :updated_at => DateTime.now.beginning_of_day..DateTime.now.end_of_day
- })
- v.size
- end
- # day as DateTime
- def visitors_on day
- v = Visit.find(:all, :conditions => {
- :updated_at => day.beginning_of_day..day.end_of_day
- })
- v.size
- end
- def visitors_total
- Visit.count
- end
- end
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?
- Vorteile: Besseres Tracking möglich, speziellere Statistiken
- 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...