Valider RSS-Feed mit Ruby on Rails

Im Netz habe ich einige Anleitungen gefunden, wie man Feeds mit Ruby on Rails erzeugt, die Ergebnisse fand ich aber entweder unzureichend oder sie waren nicht valide laut W3C. Deshalb hier der Code für den RSS-Feed, den man bei BookReporter.de findet.

Code im Controller:

def rss
@nachrichten = Nachricht.find(:all, :conditions => ["aktiv = 1"], :order=>"created_at DESC", :limit => 20)
render_without_layout
end

Und hier die View (rss.rxml):

xml.instruct!

xml.rss "version" => "2.0", "xmlns:atom" => "http://www.w3.org/2005/Atom" do
xml.channel do

xml.title       "BookReporter.de Nachrichten und Termine"
xml.link        url_for :only_path => false, :controller => 'nachrichten'
xml.description "BookReporter.de: Letzte 20 Nachrichten und Termine."
xml.language('de-de')
xml.tag!("atom:link", "href" => url_for(:only_path => false, :controller => 'nachrichten', :action => 'rss'), "rel" => "self", "type" => "application/rss+xml")
xml.pubDate      @nachrichten.first.created_at.rfc2822

@nachrichten.each do |n|
xml.item do
xml.title       n.titel
xml.link        url_for :only_path => false, :controller => 'nachrichten', :action => 'show', :id => n
xml.description truncate(textilize(n.hauptteil), length = 255, truncate_string = link_to("...",:only_path => false, :controller => 'nachrichten', :action => 'show', :id => n))
xml.guid        url_for :only_path => false, :controller => 'nachrichten', :action => 'show', :id => n
xml.pubDate     n.created_at.rfc2822
end
end

end
end

Jetzt muss noch folgender Code ins Layout und fertig ist der Feed:

<%= auto_discovery_link_tag(:rss, {:action => "rss", :controller=>"nachrichten"}, {:title =>"BookReporter.de Nachrichten und Termine"}) %>

BookReporter mit ersten Kritiken online

Gerade das Buch Tannöd ist eine der ersten Kritiken auf BookReporter: ein Buch welches es bis an die Spitze der Buchcharts geschafft hat. Während die einen sich mit dem Buch befassen, fragen sich andere ob die diversen Preise, wie Krimi des Jahres (hier negativer) gerechtfertigt sind. Außerdem hängt schon eine Klage wegen Urheberrechtsverletzung an. Wer übrigens lieber hören als lesen möchte, dem empfehle ich einen der vielen Podcasts zum Thema wie z.B. der hier verlinkte.

Mal sehen wie es mit Tannöd in den Charts weitergeht und ob es eine gute Idee von BookReporter war ausgerechtnet dieses Buch zu rezensieren.

Das Projekt selbst ist übrigens wieder in Ruby on Rails programmiert und auf dem Moviereporter-Server gehostet.

Tutorial: Ruby on Rails für Debian Sarge

Unter Windows kann man das vorgefertigte InstantRails benutzen, aber auch mit Debian Linux geht die Installation relativ einfach. Ich habe mich an dieser Anleitung (engl.) orientiert. Zuerst installiert man Ruby:

apt-get install ruby libzlib-ruby rdoc irb

Das war simpel und so geht’s auch weiter. Als nächstes benötigen wir die Rubypaketverwaltung RubyGems, die ich mir in der Version 0.9.0 heruntergeladen habe. Nach dem entpacken wechselt man in das neue Verzeichnis und startet die Installation:

ruby setup.rb all

Nun installieren wir Rails:

gem install rails –include-dependencies

Der Apache2 Webserver war bei mir bereits vorhanden und ich musste nur noch einige Bibliotheken hinzufügen:

apt-get install libapache2-mod-fastcgi libfcgi-ruby1.8

Je nach Datenbank muss man noch libmysql-ruby, libpgsql-ruby oder libsqlite3-ruby hinzufügen. Auf meinem Server läuft Mysql weshalb ich folgenden Befehl nutzte:

apt-get install libmysql-ruby

Damit wären alle benötigten Dateien vorhanden. Jetzt geht es an die Konfiguration. Als Benutzer nutze ich rails, den ich bereits im Subversion Tutorial erstellt habe und erzeuge das Grundgerüst für die Railsanwendung:

rails /home/rails/meineApp

Danach habe ich noch die Gruppenrechte (www-data) auf den Webserver gesetzt, damit es da keine Probleme gibt:

chown -R rails:www-data /home/rails/meineApp

FastCGI haben wir bereits installiert. Für Ruby ist das auch unbedingt nötig, denn so sind die Ladezeiten deutlich kürzer. Damit FastCGI aktiviert wird erstellt man zwei Links:

cd /etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/fastcgi.load
ln -s /etc/apache2/mods-available/fastcgi.conf

Ein VirtualHost für Apache könnte dann so aussehen:

(VirtualHost \

meineIP:80 \
)

ServerName meineDomain
ServerAlias www.meineDomain
DocumentRoot /home/rails/meineApp/public/
(Directory /home/rails/meineApp/public/)

Options ExecCGI +FollowSymLinks
AllowOverride All
order allow,deny
allow from all

(/Directory)

(/VirtualHost)

Achtung da fehlen einige Größer- und Kleinerzeichen. Bitte die Klammern entsprechend ersetzen!

Im Verzeichnis /home/rails/meineApp/public/ muss man die .htaccess-Datei noch auf FastCGI anpassen und dabei sollten folgende Zeilen vorhanden sein:

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

Die letzte Zeile ruft die FastCGI-Version aus. Bei mir war die Datei allerdings noch nicht ausführbar:

chmod +x /home/rails/meineApp/public/dispatch.fcgi

Eigentlich sollte dann schon alles laufen. Damit die störende index.html nicht beim Aufruf des Verzeichnisses, sondern gleich Ruby on Rails startet, habe ich sie einfach umbenannt und in der Datei /home/rails/meineApp/config/routes.rb die Route angepasst.

Damit auch die Datenbank funktioniert gibt man in /home/rails/meineApp/config/database.yml noch die richtigen Daten an.

Bei mir traten dann noch zwei Fehler auf. Ich hatte ein bestehendes Projekt kopiert und dadurch musste ich in der Datei /home/rails/wetteifern/config/environment.rb die Rails_Gem_Version anpassen. Außerdem war im dispatcher noch ein falscher Pfad und ich habe die erste Zeile geändert:

#!/usr/bin/ruby

Nachdem diese Fehler behoben sind, sollte alles prolemlos funktionieren. Mehr zur Installation und Programmierung mit Ruby On Rails findet ihr bei Silab.

howto: Subversion mit Debian und Eclipse

Für mein aktuelles Ruby on Rails Projekt wurde Subversion (SVN) benötigt. Mit dem RadRails Plugin für Eclipse kann man wunderbar arbeiten. Leider bringt Eclipse nur CVS zur Versionskontrolle mit und man benötigt das Subclipse Plugin um auch SVN zu nutzen.

Doch zuerst zum Server, der in meinem Fall unter Debian Linux läuft.

apt-get install subversion

Und schon ist Subversion installiert. Noch fehlt aber ein Serverprozess. Man sollte nicht alles als root laufen lassen und deshalb habe ich vorher einen rails Benutzer angelegt:

adduser rails

Da ich mit diesem auch entwickle, hat sich das angeboten. Selbstverständlich kann man auch einen eigenen SVN Nutzer anlegen. Ist man als dieser angemeldet, erstellt man sich ein Repository bzw. Projektarchiv:

svnadmin create /home/rails/meinPfad

Eventuell muss man das Verzeichnis vorher anlegen. Im dortigen conf-Verzeichnis die svnserve.conf anpassen:

[general]
#anon-access = read
#anon-access = write
# Kein Zugriff für anonyme Nutzer:
anon-access = none
auth-access = write

password-db = passdb
realm = rails

Jetzt muss noch eine passdb-Datei im gleichen Verzeichnis erstellt werden:

[users]
rails = meinPasswort

Dann kann der Server als Daemon gestartet werden:

nohup svnserve -r /home/rails/ -d –listen-port 3690

Nohup sorgt dafür, dass das Programm im Hintergrund läuft. Auf der Konsole sollte man zuerst Testen ob der Server auch wie gewollt funktioniert:

svn list svn://meineIP/meinPfad

Gibt es dort Fehler mit dem Pfad, dann kann man versuchen den Server ohne -r Pfadangabe zu starten und muss hinter der IP den absoluten Pfad angeben.

Läuft der Subversion Server, so können wir uns an die Konfiguration von Eclipse machen.

Für Eclipse 3.2 muss man nur den Subclipse Update Server angeben und dann das Paket auswählen. Help > Software Updates > Find and Install > Search for new… > New Remote Site

http://subclipse.tigris.org/update_1.2.x

Ist die IDE neu gestartet, kann Subclipse verwendet werden. Öffnet man die SVN Perspektive, kann man hier neue Archive angeben. Als Repository Location gibt man folgendes ein:

svn://meineIP/meinPfad

Danach sollte eine Passwortabfrage kommen und es kann losgelegt werden. Viel Erfolg!