12 Nützliche Helfer mit ActiveSupport
ActiveSupport bietet sehr nützliche Methoden, die den Alltag der Programmierer erleichtern.
Objekte erweitern
ActiveSupport ist eine Ansammlung von Hilfsklassen und Standard-Bibliothekerweiterungen, die sehr nützliche Methoden zur Verfügung stellen. Das Besondere an diesen Methoden ist, dass ActiveSupport die Standard-Datentypobjekte wie String, Fixnum, Array usw. um praktische Methoden erweitert. Zum Beispiel wird die Klasse Array um die Methode sum erweitern, um die Summe aller Elemente zu berechnen. Aber nicht nur die Standard Datentypobjekte werden erweitert, sondern es stehen auch Methoden zur Verfügung, die auf alle Objekte anwendbar sind.
In diesem Kapitel werden nur die wichtigsten Methoden vorgestellt. Einige Methoden sind nur für die interne Programmierung des Rails-Frameworks entwickelt worden und haben für Rails-Projekte in der Regel geringe Relevanz, weswegen wir diese Methoden hier nicht aufführen. In der Rails-Dokumentation http://api.rubyonrails.com/ können Sie alle Befehle nachschlagen.
Sie können die Methoden von ActiveSupport überall in Ihrem Rails-Projekt verwenden. Sie können ActiveSupport sogar unabhängig von Rails einsetzen, wenn Sie ihn am Anfang Ihres Scripts mit require einbinden.
require "rubygems" require "active_support" puts [1,2,3].sum # => 6 >> 7.days.from_now # => Tue Mar 04 00:07:17 +0100 2008
Rails-Konsole
Die Beispiele in diesem Kapitel können Sie zum Testen direkt in der Rails-Konsole (ruby script/console) eingeben. Der require -Befehl muss in der Rails-Konsole nicht angegeben werden, da ActiveSupport automatisch geladen wird.
12.1 Zahlen
ActiveSupport stellt eine Reihe von praktischen Methoden zur Verarbeitung von Zahlen zur Verfügung.
Gerade und ungerade Zahlen
Um festzustellen, ob eine ganze Zahl gerade ist oder nicht gibt, es verschiedene Möglichkeiten. Eine Möglichkeit besteht darin, den Rest der ganzzahligen Division (modulo) zu ermitteln.
zahl = 5 if zahl % 2 == 0 "gerade" else "ungerade" end => "ungerade"
even?, odd?, multiple_of?
ActiveSupport erweitert die Klasse Integer, um die Methoden even?, odd? und multiple_of? . Die Methode even? überprüft, ob eine Zahl gerade ist, und die Methode odd? testet, ob eine Zahl ungerade ist. Die Methode multiple_of? überprüft, ob eine Zahl ein Vielfaches von einer anderen Zahl ist.
1.even?\textbf{} => false 1.odd? => true 9.multiple_of? 3 => true
Ordinalzahlen
Ordinalzahlen werden in der englischen Sprache benötigt. Für die Umwandlung von einer ganzen Zahl (Integer) in eine Ordinalzahl nutzen wir die Methode ordinalize:
1.ordinalize => "1st" 2.ordinalize => "2nd" 3.ordinalize => "3rd" 5.ordinalize => "5th" 123.ordinalize => "123rd"
Kapazitätseinheiten
Bytes umwandeln
Die Methoden byte, kilobyte, megabyte, gigabyte, terabyte, petabyte und exabyte dienen zum Umwandeln der Kapazitätseinheiten. Es gibt die Methoden jeweils auch in der Pluralvariante, wie z. B. kilobytes . Der Rückgabewert dieser Methoden ist immer eine Zahl vom Typ Integer.
1.byte => 1 1.kilobyte => 1024 2.kilobytes => 2048 1.megabyte => 1048576 1.gigabyte => 1073741824 1.terabyte => 1099511627776 1.petabyte => 1125899906842624 1.exabyte => 1152921504606846976
Sie können auch Berechnungen durchführen:
1.kilobyte + 100.bytes => 1124 1500.kilobytes/1.megabyte => 1 1500.kilobytes/1.megabyte.to_f => 1.46484375
to_f
Da die Methoden als Rückgabewert ganzzahlige Zahlen zurückliefern, müssen Sie einen der Werte mit der Methode to_f in eine Fließkommazahl umwandeln, wenn Sie als Rückgabewert der Berechnung eine Kommazahl (float) erhalten möchten.
Datum und Zeit
ActiveSupport erweitert das Date-, das DateTime- und das Time-Objekt um zahlreiche nützliche Methoden.
Beginning
Den Anfang der Woche, des Monats, des Quartals und des Jahres zu einem gegebenen Datum ermittelt man leicht mit den Methoden beginning_week, beginning_month, beginning_quarter und beginning_year.
date = Date.new(2008,12,24) => Wed, 24 Dec 2008 date.beginning_of_week => Mon, 22 Dec 2008 date.beginning_of_month => Mon, 01 Dec 2008 date.beginning_of_quarter => Wed, 01 Oct 2008 date.beginning_of_year => Tue, 01 Jan 2008
Ago
Mit der Methode months_ago(n) wird das Datum vor n Monaten bestimmt, mit der Methode months_since(n) das Datum nach n Monaten. Analog gibt es die Methoden years_ago(n) und years_since(n).
date = Date.new(2008,12,24) => Wed, 24 Dec 2008 date.months_ago(2) => Fri, 24 Oct 2008 date.months_since(3) => Tue, 24 Mar 2009 date.years_ago(10) => Thu, 24 Dec 1998 date.years_since(2) => Fri, 24 Dec 2010
Next
Die nächste Woche, der nächste Monat und das nächste Jahr werden mit den Methoden next_week, next_month und next_year berechnet.
Um den letzten Monat zu bestimmen, kann man die Methode last_month aufrufen. Das letzte Jahr kann mit der Methode last_year bestimmt werden.
Zur Berechnung des letzten Tages eines Monats dient die Methode end_of_month.
date = Date.new(2008,12,24) => Wed, 24 Dec 2008 date.next_week => Mon, 29 Dec 2008 date.next_month => Sat, 24 Jan 2009 date.next_year => Thu, 24 Dec 2009 date.last_month => Mon, 24 Nov 2008 date.last_year => Mon, 24 Dec 2007 date.end_of_month => Wed, 31 Dec 2008
Arithmetische Operationen
Sehr praktisch ist die Möglichkeit, arithmetische Operationen auf Zeit-Objekten durchzuführen. 1.day + 5.hour + 10.minutes ermittelt z. B. die Anzahl der Sekunden, die einem Tag, fünf Stunden und 10 Minuten entsprechen. Es stehen die folgenden Methoden zur Verfügung:
- second, seconds
für die Umwandlung von Sekunden nach Sekunden (liefert immer die identische Zahl)
- minute, minutes
für die Umwandlung von Minuten nach Sekunden
- hour, hours
für die Umwandlung von Stunden nach Sekunden
- day, days
für die Umwandlung von Tagen nach Sekunden
- week, weeks
für die Umwandlung von Wochen nach Sekunden
- fortnight, fortnights
für die Umwandlung von jeweils 14 Tagen nach Sekunden
- year, years
für die Umwandlung von Jahren nach Sekunden
1.week == 7.days => true 1.fortnight == 14.days => true
Sie können die Methoden auch nutzen, um z. B. die Anzahl Tage statt der Anzahl Sekunden zu berechnen. Um z. B. für zwei Wochen und drei Tage die Anzahl der Tage zu ermitteln, teilen Sie die Anzahl Sekunden durch einen Tag:
(2.weeks + 3.days)/1.day => 17
Sehr häufig treffen Sie im Programmieralltag auf folgende Aufgaben: Ermitteln Sie das Datum in genau 14 Tagen oder das Datum und die Uhrzeit vor 12 Stunden.
Zukunft
Für die Ermittlung von zukünftigen Zeiten wird die Methode from_now oder since verwendet:
0.day.from_now => Thu Feb 22 00:05:58 +0100 2007 1.day.from_now => Fri Feb 23 00:05:58 +0100 2007 (1.day + 3.hours).from_now => Fri Feb 23 03:07:02 +0100 2007
Vergangenheit
Für die Ermittlung von vergangenen Zeiten werden die Methoden ago und until verwendet:
0.day.until => Thu Feb 22 00:05:58 +0100 2007 1.day.until => Wed Feb 21 00:14:06 +0100 2007 (1.day + 3.hours).until => Tue Feb 20 21:14:27 +0100 2007
ActiveSupport stellt auch nützliche Methoden zur Verfügung, um Objekte der Klasse String oder Time in Datums-Objekte und Time-Objekte in Datums-Objekte oder Strings umzuwandeln.
In ein Datum umwandeln
Die Methode to_date wandelt ein als String formatiertes Datum oder ein Time-Objekt in ein Objekt der Klasse Date um:
"06-02-1968".to_date => 1968-02-06 puts Time.now.to_date => 2007-05-29
In eine Zeit umwandeln
Die Methode to_time wandelt eine als String formatierte Uhrzeit oder ein Datums-Objekt in ein Objekt der Klasse Time um. Als Parameter können Sie dieser Methode die Werte :utc (Standard) oder :local übergeben:
"06-02-1968 03:00:00".to_time => Tue Feb 06 03:00:00 UTC 1968
today, yesterday, tomorrow
Die Klassen-Methode today der Date-Klasse ermittelt das aktuelle Datum. ActiveSupport erweitert die Date-Klasse um die Methoden yesterday und tomorrow.
Date.today => Mon, 15 Oct 2007 Date.tomorrow => Tue, 16 Oct 2007 Date.yesterday =>Sun, 14 Oct 2007
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.