Guerilla Projektmanagement

IT Projekte und Zeuch

Projekt P Tag 2: Newsletter

Bei der Entwicklung der Seite werde ich die wichtigsten Funktionen zuerst entwickeln. Sollte irgendetwas gründlich schief laufen, sollen sich die Kunden zumindest schon mal als User registrieren können und eine Newsletter empfangen können.

User und Newsletter-Empfänger trenne ich dabei. Die Newsletter wird – klar – durch ein DoubleOptIn Verfahren abonniert werden. Das heißt, dass man sich auf der Seite anmeldet und anschließend einen Bestätigungslink zugeschickt bekommt. Ich brauche allerdings noch ein wenig mehr. Ich möchte neben der Mailadresse auch Name und Anschrift des Abonnenten haben (natürlich freiwillig).

Also sieht mein Prozess so aus:
1. Kunde trägt seine Mailadresse auf der Seite ein
2. Kunde bekommt eine Mail mti einem Bestätigungslink
3. Kunde ruft den Link auf und gibt anschließend weitere Daten ein
4. Datensatz wird aktiviert.

Ok, wir brauchen also zuerst eine Tabelle um die Daten abzulegen.
script/generate modell subscriber

Jetzt schnell die Attribute definiert:
CreateSubscribers < ActiveRecord::Migration def self.up create_table :subscribers do |t| t.column :name, :string t.column :vorname, :string t.column :strasse, :string t.column :plz:string t.column :ort:string t.column :mail, :string t.column :created_at, :date t.column :updated_at, :date t.column :activation_code, :string, :limit => 40
t.column :activated_at, :datetime
end
end

def self.down
drop_table :subscribers
end
end

Und die Tabelle anlegen:
rake db:migrate

created_at und updated_at sind besondere Fehler. Rails wir diese Felder selbstständig füllen.

Um sein Abo zu aktivieren, braucht der Kunde einen Aktivierungslink. Wir brauchen also einen Schlüssel, den wir in den Link einbauen. Das machen wir in der Klasse Subscriber so:
class Subscriber < ActiveRecord::Base
before_create :make_activation_code

def make_activation_code

self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
end
(...)
end

So, jetzt kann ich den controller erzeugen und mir die notwendigen Methoden bauen. Diese sind:
– activate (hier frage ich den weiteren Kundendaten)
– activate_step2 (hier speichern wir die Daten)

Und schon bin ich fertig.

Ach, mist. Da habe ich doch glatt etwas vergessen. Ich möchte dem Abonnenten die Möglichkeit geben, sich durch einen einfachen Link wieder abzumelden. Dazu muss ich aber eine Schlüssel speichern aus dem ich den Link erzeuge (also wie der activation_code, den ich dem Kunden schicke. Unter Ruby on Rails ist das aber kein Ding:
script/generate migration subscriber_deactivationcode
erzeugt mir eine neue Migrationsdatei.

Die nur schnell ausfüllen:
class Subscribers3Deactivationcode < ActiveRecord::Migration def self.up add_column :subscribers, :deactivation_code, :string, :limit => 40
end
def self.down
remove_column :subscribers, :deactivation_code
end
end

Ok, eigentlich müsste die die vorhandenen Datensätze updaten. Aber ich habe ja nur Spieldaten, also was soll’s. Jetzt noch schnell make_activation_code erweitern:
self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )

Fertig!

Ich habe natürlich nicht alles beschrieben. Der Kunde bekommt natürlich einige Mails zugeschickt. Das ist aber nicht sonderlich spektakulär. Außerdem habe ich einige Tests geschrieben, um meine Entwicklung zu überprüfen.

Zeitaufwand für das Feature? 1/2 Tag.
Geschwindigkeitsvorteil gegenüber normaler (J2EE) Entwicklung: Gering, in Jave würde man es ähnlich machen. Allerdings musste ich nicht ständig meine Arbeit übersetzen und auf einen Testserver deployen, sondern konnte direkt aus der Entwicklungsumgebung (netbeans 6) „run file“ aufrufen und habe dadurch sehr schnell meine Entwicklung testen können.

3 thoughts on “Projekt P Tag 2: Newsletter

  • Nicolas Kübler sagt:

    Allerdings musste ich nicht ständig meine Arbeit übersetzen und auf einen Testserver deployen, sondern konnte direkt aus der Entwicklungsumgebung (netbeans 6) “run file” aufrufen und habe dadurch sehr schnell meine Entwicklung testen können.

    Ist das ein „musste“ oder „müsste“? Ich kenne mich nicht mit Ruby aus, aber ich weiß nur, dass bei mir die Übersetzung im Hintergrund automatisch passiert und ein Klick auf Run deployed das auf den TestServer innerhalb weniger Sekunden (

  • Alex sagt:

    Also bei mir (Eclipse – Tomcat) lief das immer über Hot Code Replacement. Server starten und der Rest kam von alleine. Einfach nur speichern und (be)wundern.

  • Sven Rimbach sagt:

    Alex, Nicolas: Hmm, ok. Stimmt.

Schreibe einen Kommentar zu Nicolas Kübler Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

What is 14 + 13 ?
Please leave these two fields as-is:
IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)