« August 2007 | Main | Oktober 2007 »

September 2007 Archives

30.09.07

Rake me slugs!

Da die URLs nachwievor "schön" sein sollen, hatte ich das Problem, dass für die einzelnen Artikel einer Kategorie (Leistungen, Referenzen etc.) noch keine slugs (Kurznamen) hinterlegt waren. Und diese slugs tauchen eben in der Adresszeile auf und sie sollen als Navigationsgrundlage dienen.
Wie generiere ich mir also am besten eben solche?
Da der slug in Zukunft direkt beim Erstellen eines neuen Artikels generiert wird, hat im Prinzip die Generierung für bereits vorhandene slugs nix mit meiner Anwendung zu tun.
Dazu wollte ich dann rake benutzen. Da ich Befehle wie rake db:migrate o.Ä. bereits kannte, dachte ich mir wird das damit bestimmt schön zu lösen sein...
Und so war's dann auch. Zu meinem Glück hatten die Jungs von railsenvy.com gerade ein rake-Tutorial veröffentlicht. Dieses kann ich nur empfehlen, wenn man sich noch nicht mit rake auseinandergesetzt hat: http://www.railsenvy.com/2007/6/11/ruby-on-rails-rake-tutorial

Und ich muss sagen, es ist wirklich ziemlich einfach gewesen ein kurzes Skript zu schreiben, um mir sämtliche slugs generieren zu lassen:

namespace :db do
  desc "Creates a slug for each article in the database, based on
           its title"
  task(:create_slugs => :environment) do
    articles = Article.find(:all, :conditions => { :slug => nil })
    articles.each do |article|
        article.update_attribute("slug", article.generate_slug
                                            (article.title))
    end
  end # of task do
end # of namespace do

Und schon hatte ich alles zusammen und konnte weiterarbeiten.
Zur Erläuterung: die Methode generate_slug() entfernt alle Sonderzeichen etc.

27.09.07

HTML-Tags aus einem String entfernen mittels regulärem Ausdruck [UPDATE]

Mein erster Kontakt mit Regulären Ausrücken: ich wollte - im Rahmen der neuen innoq-Webseite - aus einem String sämtliche HTML-Tags entfernen.

Bevor ich direkt nach einer fertigen Lösung suche, dachte ich mir probierst du das mal selbst aus, und dabei bin ich auf 2 ganz nützliche Online-Tools gestoßen, die einem helfen Regular Expressions zu überprüfen:

  1. reWork: Mit diesem Tool kann man einen regulären Ausdruck gegen einen bestimmten Text Prüfen. Sehr nützlich, vor allem, weil er auch für gewisse Aufgaben direkt den Code ausspuckt. So gibt er Ruby-, Javascript-, Python- und PHP-Code aus und liefert auf Wunsch auch direkt die Syntax für eine spezielle Aufgabe aus, wie z.B. das ersetzen eines Teilstrings.

  2. txt2re: Hiermit kann man quasi umgekehrt vorgehen und sich seinen regulären Ausdruck für einen bestimmten Textpattern zusammenstellen. Nicht so schick, und auch nicht wirklich vollständig, aber es hilft einem einen Ansatz zu finden, wenn man eigentlich keine Ahnung hat.

Naja, nach einiger Rumprobiererei hab ich's leider nicht ganz hinbekommen einen passenden regulären Ausdruck zu finden, obwohl die Lösung, die ich dann genommen habe sehr einleuchtend ist:

<[^>]*>

Also mein Code-Schnipsel sieht dann so aus:

item.markdown_content.gsub(/<[^>]*>/, '').to(250)

[UPDATE]: Ich kann auch wieder ein Cheat Sheet von Dave Child empfehlen: http://www.ilovejackdaniels.com/cheat-sheets/regular-expressions-cheat-sheet/

20.09.07

PrettyURLs

Die "neue" innoQ-Homepage soll auch nachwievor schöne URLs haben, sog. PrettyURLs. Die Hauptnavigation der Seite besteht aus verschiedenen Kategorien, wie z.B. "Leistungen", "Referenzen" usw. Siehe auch folgenden Ausschnitt: Bild%202.png

In der Anwendung ist es so modelliert, dass jeder Link eine Kategorie repräsentiert. Somit hat man also einen Controller categories. Gemäß dem Standard in Rails werden diese Kategorien also über Links also z.B. über /categories/3 aufgerufen, wobei categories der Controller ist und 3 die entsprechende ID. Wie bekommt man es aber hin, dass man das Selbe mit einer PrettyURL hinbekommt, also z.B. /leistungen/?

Zunächst muss ich noch erzählen, dass in der Datenbank für jede Kategorie neben dem "schönen" Namen (long_name), welcher auch Sonderzeichen enthalten kann, auch einen "slug", einen Kurznamen, für jede Kategorie gibt. Dieser beinhaltet keine Sonderzeichen und ist quasi URL-freundlich.

Jetzt sollte man zunächst eine entsprechende Route anlegen, die dafür zuständig ist, die URL korrekt umzusetzen. Dies geschieht in routes.rb im config-Verzeichnis:

map.connect ':slug', :controller => "categories", :action => "show"
:slug speichert eben solchen. Also z.B. "leistungen" oder "Referenzen". Über :controller und :action wird dann gesagt, was damit passieren soll. In der Action show im categories controller passiert dann folgendes:
if params[:id] 
  @category = Category.find(params[:id])
else
  @category = Category.find(:first,
                      :conditions => { :slug => params[:slug] })
end

@path = "../" 

Der erste Teil der Anweisung ist dafür da, dass Standard-Rails-Weg immer noch funktioniert. Im else-Zweig wird dann einfach statt nach der ID nach dem entsprechenden slug in der Datenbank gesucht. @path wird den Links vorrangestellt, da man ja, wenn man in eine der Kategorien navigiert, eine Hierarchiestufe tiefer ist als bisher und man somit erst wieder eine Stufe nach oben navigieren muss, damit der Link stimmt.

Das war es dann auch fast schon. Jetzt muss man nur noch die Links in der View anpassen:

    <= link_to category.long_name, @path + category.slug + "/" >
< end >

(die %-Zeichen müsst ihr euch denken. Hab's nicht hinbekommen, die drinzulassen, ohne das der Code verschwindet). Also im Prinzip eigentlich ganz einfach, nur finde ich sind die Routes, also map.connect etc., relativ wenig dokumentiert.

Was ich wahrscheinlich als nächstes implementiere ist der Fall, dass eine ungültige URL angegeben wird.

Wie findet ihr die Lösung? Ist die so in Ordnung, oder bekommt man das Ganze noch eleganter hin?

19.09.07

Das "Wie erstelle ich ein neues EdgeRails Projekt"-Tutorial

Die innoq-Webseite soll auf Ruby On Rails portiert werden. Zu diesem Zweck nutze ich EdgeRails. EdgeRails ist die aktuellste Entwickler-Revision von Rails, die Features enthält, die wahrscheinlich in einer der nächsten Rails-Versionen implementiert werden. Mehr dazu gibt's auch hier: http://wiki.rubyonrails.org/rails/pages/EdgeRails

Unter dieser Adresse findet man zwar auch eine Anleitung dafür, wie man eine bestehende Rails-Anwendung unter EdgeRails laufen lassen kann, aber eben nicht, wie man eine komplett neue EdgeRails-Anwendung erstellt. Und genau das möchte ich hier erläutern. Zumdindest für Unix-Systeme (Mac OSX, Linux etc.). Windows-User müssen die Befehle entsprechend anpassen. Subversion muss installiert sein für dieses Tutorial. Subversion gibt's hier: http://subversion.tigris.org/

Deine aktuelle, systemweite Rails-Installation ist nicht betroffen und wird nicht überschrieben o.Ä. Du kannst weiterhin "normale" Rails-Anwedungen erstellen, wie bisher.

Auf ins Terminal und los geht's:

1. Wechsel in das Verzeichnis in welchem du das Projekt anlegen möchtest. Z.B. so:

cd RubyOnRailsProjects/

2. Die neuste EdgeRails-Version mittels Subversion auschecken und im Ordner rails speichern:

svn co http://dev.rubyonrails.com/svn/rails/trunk rails

Jetzt musst du einen Moment warten, bis der ganze Kram runtergeladen ist.

3. Lege ein neues EdgeRails Projekt an:

ruby rails/railties/bin/rails dein_edge_projekt

Der Projektordner (hier: dein_edge_projekt) wird angelegt inkl. der entsprechenden Struktur und den entsprechenden Dateien.

4. Verschiebe den rails-Ordner nach ./dein_edge_projekt/vendor/

mv rails ./dein_edge_projekt/vendor/

Für rails-Befehle wie z.B. script/generate scaffold article wird dann immer die Dateien unter vendor/rails genommen. Es kommt quasi einem rake:freeze:edge gleich, nur das die Dateien nicht erneut runtergeladen werden.

Das war's!

Viel Spass mit deiner EdgeRails Anwendung.

Für Verbesserungsvorschläge, Lob, Kritik etc. könnt ihr gerne die Kommentarfunktion nutzen. ;-)

05.09.07

RM-Install

rm-install.png

RM-Install, powered by BitRock, is a free, multi-platform, enterprise-class Ruby on Rails stack enabling you to instantly begin developing and deploying great Rails applications without the worry of installing or maintaining the various integrated software components.

Sicherlich einen Blick wert, wenn man eine komplett neue Entwicklungsumgebung aufsetzt. Folgende Dinge sind dabei:

Ruby 1.8.6
Rails 1.2.3
MySQL 5.0
SQLite 3.3
Subversion 1.4
Apache HTTP Server 2.2 (Production mode)
OpenSSL
ImageMagick 6.3
Mongrel/Mongrel Cluster
Capistrano
Gruff
Rake
RMagick

Sieht schonmal recht komplett aus, wie ich das mit meinen Anfängeraugen beurteilen kann. Das Ganze ist demnach auch nicht wirklich leichtgewichtig mit seinen 430 MB.

Im Moment ist es nur für Linux- und MacOSX-Systemen mit Intel-Prozessoren verfügbar, andere Systeme sollen aber in Kürze auch unterstützt werden.
So muss ich mich noch etwas gedulden, um den Kram ausprobieren zu können, da mein Powerbook eben ein Powerbook ist und nen G4 PowerPC verbaut hat.

Hier der Link: http://www.fiveruns.com/products/rm/install

About

DanielHi. I'm Daniel Pietzsch and this is my innoQ-Blog. I'm a 26y old student at FH Bochum and working student at innoQ.
In this blog I mainly write about the progress concerning my diploma thesis which will be an in-house application for innoQ based on Ruby on Rails, but some other (geek) stuff might appear here, too.

daniel [dot] pietzsch [alt-L] innoq [dot] com

I recommend

Categories

Recent Comments

License

Creative Commons License This weblog is licensed under a Creative Commons License.
Powered by
Movable Type 3.31