Archive for the ‘Ruby’ Category

Lösung für “undefined method ‘require_gem’ for main:Object (NoMethodError)”

Mittwoch, Juni 17th, 2009

Auf meinem Server streikte rake. Ich bin mir nicht sicher, ob das vielleicht immer schon war und ich es nur nicht verwendet habe (benutze eigentlich Capistrano für alle Aufgaben). Ich möchte die Lösung jedenfalls nicht hinter dem Berg halten und nehme es zum Anlass auf diesem verstaubten Blog mal wieder einen Beitrag zu veröffentlichen.

Der Aufruf von rake wurde immer mit

/var/lib/gems/1.8/bin/rake:17: undefined method `require_gem' for main:Object (NoMethodError)

quittiert. Nach kurzer Suche fand ich die Lösung für ein ähnliches Problem. Anstelle von rails nimmt man sich hier einfach rake vor (auf meinem Debian-Server unter /var/lib/gems/1.8/bin/rake zu finden) und tauscht dort in Zeile 17 “gem_require” gegen “gem” aus.

Das funktioniert… was allerdings die eigentliche Ursache für das Problem ist, bleibt unklar. Wer einen Fix kennt, ohne am rake-Quelltext rumzupfuschen, ist willkommen zu kommentieren!

RubyGems: –no-ri und –no-rdoc als Vorgabe

Mittwoch, März 18th, 2009

Beim Installieren neuer Gems erstellt RubyGems automatisch RDoc und Ri-Dateien. RDoc erzeugt eine Dokumentation aus den im Quelltext enthaltenen Kommentaren über Klassen- und Methodensignaturen.

Ob das in Zeiten von Flatrates und Google sinnvoll ist, muss jeder selbst entscheiden. Vorteilhaft ist der schnellere Zugriff (unter Ubuntu befinden sich die Dateien in /usr/lib/ruby/gems/1.8/doc), nachteilig das (einmalige) lange Parsing bei der Installation.

RDoc-Erzeugung ausschalten

Die Erzeugung der lokalen Dokumentation kann mit den zusätzlichen Paramtern –no-ri und –no-rdoc für den gem-Befehl unterbunden werden. Häufig begegne ich diesen Parametern auch in Installations-Anleitungen für Gems. Daraus schließe ich mal, das ich nicht der einzige bin, den die Standardeinstellung nicht zufriedenstellt, schließlich beansprucht die RDoc-Erzeugung oft 95% der gesamten Installationszeit.

Lästig also, wenn man –no-rdoc und –no-ri mal wieder vergisst, wenn man gerade das Rails-Framework updaten möchte. Ebenso lästig, dass man –no-rdoc und –no-ri überhaupt eintippen muss!

Keine RDoc-Erzeugung als Standard setzen

Es gibt jedoch Abhilfe: gem liest Parameter automatisch aus der Datei $HOME/.gemrc ein

legt man also die Datei .gemrc in seinem Heimatverzeichnis an, und fügt dort die Zeile

gem: –no-ri –no-rdoc

hinzu, werden diese beiden Parameter jeweils automatisch benutzt. Selbst wer die die lokale Dokumentation auf seinem Entwicklungsrechner haben möchte, sollte diese Datei zumindest auf seinem Server anlegen.

Diese Information habe ich in der RubyGems-Dokumentation gefunden, wo noch mehr Optionen aufgeführt sind.

Bonus-Tipp:

APIdoc.com ist eine aufgebohrte Alternative zur offiziellen Dokumentation von Rails. APIdoc.com stellt nicht nur einfachen Zugriff auf ältere Versionen her sondern ermöglicht auch Kommentare (wie z.B. in der PHP-Doku). Neben Rails sind ist dort auch die Dokumentation für Ruby selbst und RSpec zu finden.

Daten aus der IRB-Console speichern mit einer Zeile

Dienstag, Mai 27th, 2008

Rails bringt ein Konsolenskript mit, welches IRB mit der Rails-Umgebung lädt. Dort stehen dann alle im Rails-Projekt verwendeten Klassen zur Verfügung. Erreichen kann man diese Konsole unter der Eingabe von “ruby script/console [environment]” Wird keine Umgebung (environment) angegeben, ist die Development-Umgebung gewählt. Das bedeutet, die Datenbankverbindung wird zur Development-Datenbank aufgebaut. Alternativ kann man hier auch “production” (oder “test”, etc.) angeben.

Nun kann man beliebige Ruby-Befehle eingeben und das Ergebnis gleich begutachten. Aber darum soll es hier jetzt gar nicht im Detail gehen. Die Konsole ist ungeheuer praktisch, wenn man Daten aus der Datenbank auslesen möchte, die über komplexe Models verknüpft sind. Statt direkt auf der SQL-Konsole mit langen JOINs rumzubasteln, benutzt man einfach ein die Model-Klassen aus dem Rails-Projekt.

Dateien schreiben mit der File-Klasse

Aber wie bekommt man diese Daten aus der Konsole? Die File-Klasse ermöglicht es Dateien mit einem Block zu schreiben, so dass der ganze Befehl nur eine einzige Zeile benötigt:

File.open("output.txt", "w") { |f| f.puts "Ausgabe" }

Das erzeugt eine Datei output.txt im aktuellen Verzeichnis und schreibt den Inhalt “Ausgabe” hinein. (Das “w” als zweiter Parameter gibt den schreibmodus an, vorherige Inhalte der Datei werden gelöscht!)

Nehmen wir als einfaches Beispiel an, uns interessieren alle Benutzernamen eines fiktiven Projekts, nach Name sortiert. In der Konsole erhalten wir durch Eingabe von

User.find(:all, :order => :name)

eine solche Liste als Array von User-Objekten. Mit einem kurzen Block können wir die gewünschten Namen Ausgeben:

User.find(:all, :order => :name).each { |user| puts user.name }

Um diese Liste jetzt aus der Konsole zu bekommen, setzen wir diese Zeile innerhalb des File-Blocks ein. Wichtig hierbei ist, dass die puts-Anweisung auf das File-Objekt angewendet wird, damit die Ausgabe dorthin umgeleitet wird!

File.open("output.txt", "w") { |f| User.find(:all, :order => :name).each { |user| f.puts user.name }  }

Fertig! Jetzt kann die Konsole mit der Eingabe von quit oder exit beendet werden und im gleichen Verzeichnis findet sich eine Datei mit dem Namen output.txt, die die Liste enthält.

Die Abfrage im Beispiel ist natürlich trivial- bei komplexeren Abfragen mit viel Model-Logik ist es aber eine große Erleichterung.