8.3 Helper 

Möglichst wenig Ruby-Code
Die Templates haben die Aufgabe, die Daten des Models anzuzeigen. Dazu enthalten sie HTML-Code und nicht mehr Ruby-Code als nötig. Das heißt, wir müssen dafür sorgen, dass keine Programmierlogik innerhalb der Templates vorkommt, sondern nur so viel Ruby eingesetzt wird, wie erforderlich ist, um die Instanzvariablen, die in den Controllern gesetzt werden, auszugeben.
Dazu stellt uns Rails zum einen ActionView-Helper-Methoden zur Verfügung, die wir nutzen können, um zum Beispiel HTML-Tags zu generieren, zum anderen haben wir aber auch die Möglichkeit, eigene Helper-Methoden zu definieren.
Eingebaute Helper
Rails bietet uns einige ActionView-Helper-Methoden, mit deren Hilfe wir ganz schnell HTML-Tags, wie zum Beispiel Formular-Tags oder Tags zum Einbinden von Stylesheet- und JavaScript-Dateien, erzeugen können.
Wir wollen Ihnen die ActionView-Helper-Methoden, die Sie im Alltag am häufigsten brauchen werden, vorstellen.
Helper in der Rails-Console testen |
Die Helper werden normalerweise im Template eingesetzt. Sehr praktisch
für Testzwecke ist die Möglichkeit, Helper-Methoden in der Rails-Console
(ruby script/console ) auszuführen. Dazu müssen Sie lediglich helper.
den Helper-Methoden voranstellen. Um z. B. die mail_to-Methode auszuführen,
können Sie Folgendes in die Rails-Console eingeben:
helper.mail_to "lee@adama.com" Etwas irritierend an der Ausgabe der Rails-Console sind die geschützten Hochkommata. Wird die Methode statt in der Rails-Console im Template ausgeführt, wird Folgendes ausgegeben: <a href="mailto:lee@adama.com">lee@adama.com</a> Zur besseren Lesbarkeit wird im Folgenden auf das vorangestellte helper. verzichtet, und die Ausgaben der Rails-Console werden ohne geschützte Hochkommata angegeben. |
Helper für Verlinkungen 

link_to
Links erzeugen
Um einen Link in HTML zu erzeugen, nutzen wir außerhalb eines Rails-Projektes den Tag <a>, dem wir über das Attribut href den Zielpfad des Links übergeben. Das könnten wir sogar auch in einem ERB-Template einsetzen. Zum Beispiel könnten wir auf einen Flug mit der ID 2 wie folgt verlinken:
<a href="/flights/2">Details zu Flug 2</a>
Diesen Link könnten wir so in einem unser Template-Dateien einsetzen, und es würde funktionieren. Aber das haben Sie bis jetzt in noch keinem Beispiel dieses Buches gesehen. Das liegt daran, dass Rails die ActionView-Helper-Methode link_to zur Verfügung stellt, die für uns den HTML-Code für die Links erzeugt.
Allgemein wird link_to wie folgt aufgerufen:
link_to name, ziel, html-optionen
Der erste Parameter gibt den Text an, der im Link angezeigt werden soll. Das Ziel des Links wird im zweiten Paramater angegeben. Im letzten Parameter können HTML-Optionen angegeben werden.
Ziele können u. a. wie folgt angegeben werden:
- URL
http://localhost:3000/flights/2
- Absoluter Pfad
/flights/2
- Action und Controller
{:controller => 'flights', :action => 'show', :id => 2\ }
- Benannte Routen
flight_url(2)
Zu bevorzugen sind die benannten Routen, da sie nicht nur besser lesbar, sondern auch unabhängig von der Benennung des Controllers und der Action sind.
HTML-Optionen
Als HTML-Optionen können Sie beliebige Optionen setzen, wie z. B. :class => 'hervorhebung' oder :alt => 'Infos'.
Zusätzlich stehen folgende HTML-Optionen zur Verfügung:
Tabelle HTML-Optionen für link_to
Option | Beschreibung |
:confirm | Öffnet ein JavaScript-Bestätigungs-Fenster mit der Frage, die übergeben wurde. Wird die Frage bestätigt, wird Anfrage ausgeführt, andernfalls passiert nichts. |
:popup | Der Link wird in einem Pop-up-Fenster geöffnet, wenn der Parameter auf true gesetzt wird. Statt true kann auch ein Array übergeben werden, das u. a. die Größe des Fensters angibt. |
:method | Setzt die HTTP-Methode, mit der die Ziel-URL abgerufen werden soll (Standard ist :get). Mögliche Werte sind :put, :destroy und :post. |
Beispiele
Bitte beachten Sie, dass die meisten folgenden Beispiele nicht in der Konsole funktionieren, sondern nur in einer Template-Datei:
Listing Beispiele
link_to 'Flug 2', 'http://localhost:3000/flights/2'
=> <a href="http://localhost:3000/flights/2">Flug 2</a>
link_to 'Flug 2', {:controller => 'flights', :action => 'show',
:id => 2}
=> <a href="/flights/2">Flug 2</a>
link_to 'Flug 2', flight_url(2)
=> <a href="http://localhost:3000/flights/2">Flug 2</a>
link_to 'FLug 2', flight_path(2), :class=>"flight"
=> <a href="/flights/2" class="flight">Flug 2</a>
link_to 'Flug 2', flight_path(2), :popup=> true
=> <a href="/flights/2" onclick="window.open(this.href);
return false;">Flug 2</a>
link_to 'Flug 2', flight_path(2), :popup =>
=> <a href="/flights/2" onclick="window.open(
this.href,'fenster_name','width=500,height=400');
return false;">Flug 2</a>
link_to "Flug 2 löschen", flight_path(2),
:confirm => "Sicher?", :method => :delete
=> <a href="/flights/2" onclick="if (confirm('Sicher?')) {
var f = document.createElement('form');
f.style.display = 'none'; this.parentNode.appendChild(f);
'6881fbaf41538ebf7eadb51ed814b8e962c76646');
...
f.appendChild(s);f.submit(); };return false;">
Flug 2 löschen</a>
button_to
Schaltfläche statt Link
Mit der ActionView-Helper-Methode button_to können Sie ein Formular, das nur einen Submit-Button enthält, erzeugen. Der Einsatz von button_to ist der beste Weg, um sicherzustellen, dass Links, die zu Änderungen an Datensätzen führen, nicht von Suchmaschinen ausgelöst werden. Im Prinzip wird die button_to -Methode genauso wie die link_to -Methode verwendet, nur dass statt einem Textlink, eine Schaltfläche angezeigt. Die button_to -Methode wird anders als die submit_tag - Methode, nicht zum Versenden von Formulardaten verwendet.
Allgemein wird button_to wie folgt aufgerufen:
button_to name, ziel, html-optionen
Der erste Parameter gibt den Text an, der auf dem Button angezeigt werden soll. Das Ziel des Links wird im zweiten Parameter angegeben. Im letzten Parameter können HTML-Optionen angegeben werden.
Als HTML-Optionen können Sie beliebige Optionen setzen, wie z. B. :class => 'hervorhebung' oder :alt => 'Infos'.
Zusätzlich stehen folgende HTML-Optionen zur Verfügung:
Tabelle HTML-Optionen für button_to
Option | Beschreibung |
:method | Setzt die HTTP-Methode, mit der Anfrage der Ziel-URL versendet werden soll. Mögliche Werte sind :put , :destroy und :post (Standard). |
:disabled | Wenn true , wird der Button deaktiviert. |
:confirm | Öffnet ein JavaScript-Bestätigungs-Fenster mit der Frage, die übergeben wurde. Wird die Frage bestätigt, wird Anfrage ausgeführt, andernfalls passiert nichts. |
Listing Beispiele
button_to 'Neuer Flug', :controller=> 'flights', :action=> 'new'
=> <form method="post" action="/flights/new"
class="button-to">
<div><input type="submit" value="Neuer Flug" /></div>
</form>
button_to "Lösche Flug", { :controller => 'flights',
:action => "destroy", :id => 2},
:confirm => "Sicher?", :method => :delete
=> <form method="post" action="/flights/2"
class="button-to">
<div>
<input name="_method" type="hidden" value="delete" />
<input onclick="return confirm('Sicher?');"
type="submit" value="Lösche Flug" />
</div>
...
</form>
mail_to
Mit der ActionView-Helper-Methode mail_to können Sie einen Mailto-Link-Tag erzeugen. Die Methode erwartet als Parameter die E-Mail-Adresse, an die die E-Mail versendet werden soll, den Link-Namen und HTML-Optionen. Wird kein Name für den Link übergeben, wird die übergebene E-Mail-Adresse als Name angezeigt. Die zusätzlichen HTML-Optionen für den Link können als Hash übergeben werden.
Beispiel
Als Beispiel könnten wir die E-Mail-Adressen der Mitarbeiter auf der index-Seite mit einem Mailto-Link-Tag versehen:
Listing app/views/employees/index.html.erb
...
<% for employee in @employees %>
<tr>
<td><%=h employee.firstname %></td>
...
<td><%= mail_to employee.email, 'Nachricht senden' %> </td>
<td><%=h employee.comment %></td>
...
</tr>
<% end %>
...
Im HTML-Code der Seite wurde Folgendes erzeugt:
Listing Auszug HTML-Code der index.html.erb
...
<td><a href="mailto:test@test.lu">Nachricht senden</a></td>
...
Der Helper mail_to wird allgemein wie folgt aufgerufen:
mail_to email, bezeichnung, optionen
Der Parameter email gibt die E-Mail-Adresse an. bezeichnung gibt den Text an, der im Link angezeigt werden soll.
Optionen
mail_to stellt einige Optionen zur Verfügung, um zu verhindern (bzw. zu erschweren), dass Ihre E-Mail-Adresse zwecks Spam automatisiert von der Website ausgelesen wird.
Tabelle Optionen für mail_to
Option | Beschreibung |
:subject | Setzt die Betreff-Zeile der E-Mail. |
:body | Setzt den Body der E-Mail. |
:cc | Setzt zusätzliche Empfänger, die die E-Mail als Kopie erhalten sollen (Carbon Copy). |
:bcc | Setzt zusätzliche Empfänger, die die E-Mail als Kopie erhalten sollen, aber nicht im E-Mail-Header angezeigt werden (Blind Carbon Copy). |
:replace_at | Wenn Sie keinen Namen für den Link übergeben, wird die E-Mail-Adresse als Name angezeigt. Sie können mit dieser Methode die angezeigte E-Mail-Adresse verschleiern, indem Sie das @-Zeichen durch die der Methode übergebene Zeichenkette ersetzen. |
:replace_dot | Mit dieser Methode können Sie, wenn Sie keinen Namen für den Link übergeben, die angezeigte E-Mail-Adresse verschleiern, indem Sie den Punkt innerhalb der E-Mail-Adresse durch die der Methode übergebene Zeichenkette ersetzen. |
:encode | Akzeptiert die beiden Werte »javascript« und »hex«. Übergeben Sie »javascript«, wird dynamisch ein mailto-Link erzeugt und verschlüsselt. Der Link wird nicht angezeigt, wenn der User im Browser die JavaScript-Unterstützung deaktiviert hat. Übergeben Sie »hex«, erfolgt eine hexadezimale Verschlüsselung der E-Mail-Adresse, bevor der Link ausgegeben wird. |
Listing Beispiele
mail_to "lee@adama.com"
=> <a href="mailto:lee@adama.com">lee@adama.com</a>
mail_to "lee@adama.com", "Lee Adama"
=> <a href="mailto:lee@adama.com">Lee Adama</a>
mail_to "lee@adama.com", "Lee Adama", :subject => "Anfrage"
=> <a href="mailto:lee@adama.com?subject=Anfrage">
Lee Adama</a>
mail_to "lee@adama.com", nil, :subject => "Anfrage"
=> <a href="mailto:lee@adama.com?subject=Anfrage">
lee@adama.com</a>
mail_to "lee@adama.com", nil, :cc => "info@adma.com"
=> <a href="mailto:lee@adama.com?cc=info@adama.com">
lee@adama.com</a>
mail_to "lee@adama.com", nil, :bcc => "info@adma.com"
=> <a href="mailto:lee@adama.com?bcc=info@adama.com">
lee@adama.com</a>
mail_to "lee@adama.com", nil,
:replace_at => "_at_", :replace_dot => "_dot_"
=><a href="mailto:lee@adama.com">lee_at_adama_dot_com</a>
mail_to "lee@adama.com", nil, :encode => "hex"
=><a href="mailt...">
lee@a...;</a>
mail_to "lee@adama.com", nil, :encode => "javascript"
=> <script type=\"text/javascript">eval(
unescape('%64%6f%63%75%6d%65%6e%74%...'))
</script>
:encode verwenden
Um das Scannen Ihrer E-Mail-Adresse zu erschweren, sollten Sie die Option :encode=>"javascript" verwenden.
HTML-Optionen, wie z. B. class und id, können auch als Optionen benutzt werden:
mail_to "lee@adama.com", "Lee Adama", :class=>"email"
=> <a class="email" href="mailto:lee@adama.com">Lee Adama</a>
image_tag
Bilder einfügen
Mit der Helper-Methode image_tag können Sie Bilder in Ihre Templates einfügen. Die Methode erwartet entweder eine URL, einen Pfad oder einfach nur den Dateinamen des Bildes. Wird nur der Dateiname oder ein relativer Pfad (ohne / am Anfang) angegeben, so geht Rails davon aus, dass Ihr Bild sich im Verzeichnis public/images befindet.
{Beipsiele zu image_tag}
image_tag "rails.png"
=> <img alt="Rails" src="/images/rails.png?1191043204" />
image_tag "/images/rails.png"
=> <img alt="Rails" src="/images/rails.png?1191043204" />
image_tag "logos/rails.png"
=> <img alt="Rails"
src="images/logos/rails.png?1191043204" />
image_tag "http://www.railsbuch.de/images/rails.png"
=> <img alt="Rails"
src="http://www.railsbuch.de/images/rails.png?11910..." />
In Rails ist es daher üblich, die Bilder im Verzeichnis public/images (oder in einem Unterverzeichnis) abzulegen.
Nummern hinter den Dateinamen |
Hinter dem Bildnamen fügt Rails ein Fragezeichen gefolgt von einer Nummer hinzu. Diese Nummer basiert auf dem Modifikationsdatum der angegebenen Datei. Dies hat den Vorteil, dass der Browser bei jeder Änderung der Bilddatei das Bild erneut einliest und nicht aus dem Cache lädt. Diese Nummern werden u. a. auch für die Helper stylesheet_link_tag und javascript_include_tag verwendet. |
Es stehen die folgenden Optionen zur Verfügung:
Tabelle Spezielle HTML-Optionen
Schlüssel | Beschreibung |
:alt | Setzt den alternativen Text ( alt -Attribut). Wird kein alternativer Text übergeben, wird standardmäßig der Bildname ohne die Dateiendung mit beginnendem Großbuchstaben angezeigt. |
:size | Erwartet als Wert die Angabe von »Breite« x »Höhe«. Die übergebenen Werte werden ignoriert, wenn sie nicht im korrekten Format übergeben werden. |
:mouseover | Mit dem neuen Attribut mouseover kann in Rails 2.0 ein Bild angegeben werden, das angezeigt wird, wenn man mit der Maus über das Bild fährt. Dazu wird automatisch ein passender JavaScript-Code generiert. |
HTML-Optionen
Optional können Sie HTML-Attribute übergeben, um z. B. die Attribute class oder id zu setzen.
Listing Beispiele zu image_tag
image_tag "rails.png", :alt => "Logo"
=> <img alt="Logo" src="/images/rails.png?1191043204" />
image_tag "rails.png", :size => "50x64"
=><img alt="Rails" height="64"
src="/images/rails.png?1191043204" width="50" />
image_tag "rails.png", :mouseover => "rails-over.png"
=><img alt="Rails" onmouseout="this.src='/images/rails.png?
1191043204'"
onmouseover="this.src='/images/rails-over.png'"
src="/images/rails.png?1191043204" />
image_tag "rails.png" , :class=>"bild"
=> <img alt="Rails" class="bild" src="/images/rails.png?
1191043204" />
Helper zum Einbinden von Stylesheets und JavaScripts 

stylesheet_link_tag
Um eine CSS-Datei einzubinden, können Sie entweder den HTML-Tag link verwenden oder die Helper-Methode stylesheet_link_tag einsetzen.
public/stylesheets
Wenn ein Dateiname oder ein relativer Pfad (ohne / am Anfang) übergeben wird, so erwartet Rails, dass sich die Stylesheetdatei im Verzeichnis public/stylesheets befindet.
Wird keine Dateiendung übergeben, wird automatisch die Dateiendung .css angefügt.
In der Layout-Datei app/views/layouts/employees.html.erb z. B. haben wir die CSS-Datei scaffold.css aus dem Verzeichni public/stylesheets mit dem helper stylesheet_link_tag eingebunden:
Listing app/views/layouts/employees.html.erb
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»>
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type"
content="text/html;charset=UTF-8" />
<title>Employees: <%= controller.action_name %></title>
<%= stylesheet_link_tag 'scaffold' %>
</head>
<body>
...
</body>
</html>
:all
Um alle Stylesheetdateien aus dem Verzeichnis public/stylesheets einzubinden, kann die Option :all statt des Dateinamens angegeben werden. Als weitere Option kann :media übergeben werden, die anzeigt, für welches Ausgabegerät die Stylesheetdatei bestimmt ist. Wird die Option nicht angegeben, so wird :screen verwendet:
stylesheet_link_tag 'scaffold'
=> <link href="/stylesheets/djay.css?1195379272"
media="screen" rel="stylesheet" type="text/css" />
stylesheet_link_tag 'scaffold', :media=>'print'
=> <link href="/stylesheets/djay.css?1195379272"
media="screen" rel="stylesheet" type="text/css" />
stylesheet_link_tag :all
=> <link href="/stylesheets/djay.css?1195379272"
media="screen" rel="stylesheet" type="text/css" />
<link href="/stylesheets/print.css?11953791236"
media="screen" rel="stylesheet" type="text/css" />
:cache
Mit der Option :cache werden verschiedene CSS-Dateien aus Optimierungsgründen zusammengefasst (siehe Abschnitt 16.5).
javascript_include_tag
Rails vereinfacht auch das Einbinden von JavaScript-Dateien. Der Helper javascript_include_tag erwartet bei Angabe eines Dateinamens, dass diese sich im Verzeichnis public/javascripts befindet. Wird keine Dateiendung angegeben, wird automatisch die Endung .js hinzugefügt.
:defaults
Mit der Option :defaults werden neben den JavaScript-Bibliotheken Prototype und Scriptaculous auch die JavaScript-Datei application.js eingebunden, falls diese existiert. In der application.js können Sie individuellen JavaScript-Code für Ihre Applikation einfügen.
Die Option :defaults ist besonders für den Einsatz von Ajax sinnvoll.
javascript_include_tag "prototype.js"
=><script src="/javascripts/prototype.js?1195379272"
type="text/javascript"></script>
javascript_include_tag "prototype"
=><script src="/javascripts/prototype.js?1195379272"
type="text/javascript"></script>
javascript_include_tag :defaults
=><script src="/javascripts/prototype.js ...
<script src="/javascripts/effects.js ...
<script src="/javascripts/dragdrop.js ...
<script src="/javascripts/controls.js ...
<script src="/javascripts/application.js ...
Auch hier steht die Option :cache zur Verfügung, mit der aus Optimierungsgründen mehrere JavaScript-Dateien zusammengefasst werden können (siehe Abschnitt 16.5).
Helper zur Zahlenformatierung 

Ruby on Rails stellt zahlreiche Helper zur Formatierung von Zahlen, Währungen, Telefonnummern, Speicherplatz-Größen und Prozentwerten zur Verfügung.
number_with_delimiter
Trennzeichen
Die Methode number_with_delimiter formatiert die angegebene Zahl wie im englischsprachigen Sprachraum üblich, indem die Tausenderstellen durch ein Komma separiert und die Nachkommastellen mit einem Punkt getrennt werden, wie z. B. 1,240.99 . Optional können auch die Zeichen für die Tausender- und die Nachkommastellen angegeben werden:
number_with_delimiter(zahl, tausenderzeichen, dezialzeichen)
number_with_delimiter(1240.99)
=> 1,240.99
number_with_delimiter(1240.99,".",",")
=> 1.240,99
number_with_precision
Nachkommastellen begrenzen
Mit der Methode number_with_precision werden die Nachkommastellen der angegebenen Zahl begrenzt. Als Standard wird die Zahl auf drei Stellen gerundet. Durch Angabe eines optionalen Parameters kann die Stellenanzahl direkt angegeben werden.
number_with_precision(1240.4567)
=> 1240.457
number_with_precision(1240.4567,2)
=> 1240.46
number_to_currency
Währungen formatieren
Die Methode number_to_currency(zahl,optionen) formatiert die angegebene Zahl als Währung (z. B. $12.40). Folgende Optionen stehen zur Verfügung:
Tabelle Optionen für number_to_currency
Option | Beschreibung |
:precision | Anzahl der Nachkommastellen (Standardwert: 2) |
:unit | Währungszeichen (Standardwert: $) |
:separator | Dezimalzeichen zum Trennen der Nachkommastellen (Standardwert: '.') |
:delimiter | Zeichen zum Trennen der Tausenderstellen (Standardwert: ',') |
Listing Beispiele zu number_to_currency
number_to_currency 10.129
=> $10.13
number_to_currency 10.1234, :precision=>3
=> $10.123
number_to_currency 10.99, :unit=>"EUR "
=> EUR 10.99
number_to_currency 10.99, :separator=>","
=> $10,99
number_to_currency 1250.40, :separator=>"," , :delimiter=>"."
=> $1.250,40
number_to_human_size
Bytes umwandeln
Die Methode number_to_human_size(bytes) wandelt Bytes in eine sinnvolle Größe um. Zum Beispiel werden 1.500 Bytes in 1,5 KB umgewandelt. Es wird bis zu eine Stelle nach dem Komma angezeigt. Ist das nicht erwünscht, so kann ein optionaler Parameter mit der Anzahl der Stellen angegeben werden. Der Aufruf erfolgt dann mit:
number_to_human_size(bytes,anzahl_stellen)
Die Methode ist sehr praktisch bezüglich Anzeige von Dateigrößen.
number_to_human_size(1500)
=> 1.5 KB
number_to_human_size(1048576)
=> 1 MB
number_to_human_size(2000000000)
=> 1.9 GB
number_to_human_size(2000000000,2)
=> 1.86 GB
number_to_percentage
Prozentwerte formatieren
Wenn Sie Prozentwerte anzeigen möchten (z. B. 45 %), so können Sie die Methode number_to_percentage(zahl, optionen) verwenden. Folgende Optionen stehen zur Verfügung:
Tabelle Optionen für number_to_percentage
Option | Beschreibung |
:precision | Anzahl der Nachkommastellen (Standardwert: 3) |
:separator | Dezimalzeichen, zum Trennen der Nachkommastellen (Standardwert: '.') |
number_to_percentage(45.9)
=> 45.900%
number_to_percentage(45.9, :precision=>0)
=> 46%
number_to_percentage(45.9, :separator=>',')
=> 46,900%
number_to_percentage(45.9, :precision=>2, :separator=>',')
=> 45,90%
number_to_phone
Telefonnummern formatieren
Die Methode number_to_phone dient zum Formatieren von Telefonnummern in den USA.
Da die Methode nicht für deutsche Telefonnummern verwendet werden kann, werden wir es bei einem Beispiel belassen:
number_to_phone(1234567890)
=>123-456-7890
Helper zur Textmanipulation 

Für die Formatierung von Texten stellt Rails sehr nützliche Helper zur Verfügung.
excerpt
Auszug aus einem Text
Die Methode excerpt extrahiert einen Auszug aus einem Text und wird wie folgt aufgerufen:
excerpt(text, phrase, radius = 100, excerpt_string = "...")
Der radius gibt an, wie viele Zeichen nach links und rechts vom ersten Vorkommen von phrase mit ausgegeben werden (der Standardwert ist 100). Wenn der radius größer als der Text ist, wird der excerpt_string nicht mehr vorangestellt bzw. angehängt.
Listing Beispiele zu excerpt
excerpt("Rails ist ein super Framework", "super",3)
=> ...in super Fra...
excerpt("Rails ist ein super Framework", "super",5)
=> ...ein super Frame...
excerpt("Rails ist ein super Framework", "super",50)
=> Rails ist ein super Framework
excerpt("Rails ist ein super Framework", "super")
=> Rails ist ein super Framework
excerpt("Rails ist ein super Framework", "super", 5, " # ")
=> # ein super Frame #
highlight
Textstellen markieren
Wenn Sie z. B. eine Suchfunktion implementieren möchten, in der die gefundenen Suchbegriffe hervorgehoben werden sollen, kann die Methode highlight Ihnen viel Arbeit ersparen.
Durch Aufruf von highlight(text, textabschnitt) werden alle Textstellen eines gegebenen Textes durch entsprechenden HTML-Code markiert, in denen ein gegebenes Wort oder ein gegebener Textabschnitt gefunden wurde. Die Groß-/Kleinschreibung wird bei der Suche nicht berücksichtigt.
Die Markierung erfolgt mit dem HTML-Code:
Listing Beispiele zu highlight
<strong class="highlight">...</stong>
highlight("Rails ist ein super Framework", "super")
=> Rails ist ein <strong class="highlight">super</strong>
Framework
highlight("Rails ist ein super Framework", "SuPeR")
=> Rails ist ein <strong class="highlight">super</strong>
Framework
Eigene Markierung
Sie können auch Ihren eigenen HTML-Code für die Markierung festlegen, indem sie ihn als dritten Parameter angeben. Die Zeichenfolge \1 gibt in Ihrem HTML-Code die Position an, an der das Suchwort eingefügt werden soll. Um z. B. die gefundenen Stellen mit einem em -Tag zu umschließen, rufen Sie den Helper wie folgt auf. Achten Sie bitte unbedingt darauf, dass Sie einfache Hochkommata verwenden, da sonst \1 falsch umgesetzt wird.
highlight("Rails ist ein super Framework",
"super",
'<em>\1</em>')
=> Rails ist ein <em>super</em> Framework
truncate
Text kürzen
Um einen Text auf eine bestimmte Länge zu kürzen, steht Ihnen der Helper truncate zur Verfügung:
truncate(text, length = 30, truncate_string = "...")
Der text wird auf die über den Parameter length übergebene Länge gekürzt (Standardwert ist 30). Die letzten Zeichen werden durch den truncate_string (Standard ist »...«) ersetzt. Ist der Text kürzer als die gewünschte Länge, werden die letzten Zeichen nicht durch den truncate_string ersetzt.
Listing Beispiele zu truncate
truncate("Rails ist ein super Framework", 15)
=> Rails ist ei...
truncate("Rails ist ein super Framework")
=> Rails ist ein super Framework
word_wrap
Bestimmte Zeilenbreite
Die Methode word_wrap können Sie einsetzen, um Text in einer bestimmten Zeilenbreite auszugeben.
word_wrap(text, line_width = 80)
Geben Sie keine Zeilenbreite an, wird text mit einer Zeilenbreite von 80 Zeichen ausgegeben. Der Zeilenumbruch erfolgt immer am ersten nicht darstellbaren Zeichen (Leerzeichen, Tabulator oder Zeilenumbruch), das nicht über die gewünschte Zeilenlänge hinausgeht:
Listing Beispiele zu word_wrap
word_wrap("Rails ist ein super Framework", 5)
=> Rails nist nein nsuper nFramework
word_wrap("Rails ist ein super Framework", 10)
=> Rails ist nein super nFramework
word_wrap("Rails ist ein super Framework")
=> Rails ist ein super Framework
pluralize
Pluralisieren
Mit Hilfe des Helpers pluralize können Sie ganz einfach einen Begriff pluralisieren:
pluralize(count, singular, plural = nil)
Wenn der Parameter count ungleich 1 ist und der Parameter plural gesetzt wurde, wird dieser ausgegeben. Ansonsten wird die Zeichenkette (singular) automatisch pluralisiert (nur für englische Wörter geeignet):
Listing Beispiele zu pluralize
pluralize(1, 'person')
=> 1 person
pluralize(2, 'person')
=> 2 people
pluralize(3, 'person', 'developers')
=> 3 developers
pluralize(0, 'person')
=> 0 people
Helper zur Textformatierung 

Einsatz in CMS
Die Helper-Methoden markdown und textilize kann man u. a. für die Eingabe von formatierten Texten für Content-Management-Systeme und einige Wikis verwenden. Anstatt den Benutzer des Systems die Textformatierungen aufwendig als HTML-Code eintippen zu lassen, kann er vereinfachte Codes eingeben, die dann automatisch in HTML umgewandelt werden. Rails unterstützt zwei Typen bzw. Sprachen von Codes:
- Markdown
- Textile
In der Code-Sprache Markdown schreibt man z. B. Das ist __Rails__, um das Wort Rails fett zu schreiben. In der Code-Sprache Textile hingegen schreibt man Das ist *Rails* . In beiden Fällen wird der Code in HTML umgewandelt: Das ist <strong>Rails</strong> . Es gibt auch Codes, um sehr einfach Links oder Bilder einzufügen. Absätze, die durch Leerzeilen getrennt sind, werden bei der Umwandlung in HTML automatisch durch p -Tags umschlossen.
markdown
Die Helper-Methode markdown wandelt Markdown-Code in HTML-Code um. Der Helper setzt voraus, dass das RubyGems-Paket BlueCloth installiert ist. Sie können BlueCloth mit dem folgenden Befehl installieren:
sudo gem install bluecloth
Im Folgenden Beispiel wird ein Text in der Code-Sprache Markdown mit der Helper-Methode markdown in HTML konvertiert.
Listing Beispiel zu markdown
markdown('[Rails](http://www.rubyonrails.com) ist
ein __super__ Framework')
=> <p><a href="http://www.rubyonrails.com">Rails</a>
ist ein <strong>super</strong> Framework</p>
Referenz
Eine ausführliche deutschsprachige Referenz zu den Markdown-Codes finden Sie auf der Webseite http://markdown.de/ .
textilize
Mit Hilfe des Helpers textilize können Sie Textile-Code in HTML-Code umwandeln. Der Helper textilize setzt voraus, dass das RubyGems-Paket RedCloth installiert ist. Sie können RedCloth mit dem Befehl
sudo gem install redcloth
installieren.
Listing Beispiel textilize
textilize('"Rails":http://www.rubyonrails.de ist *super*')
=> <p><a href="http://www.rubyonrails.com">Rails</a>
ist <strong>super</strong></p>
Referenz
Auf der Website http://textism.com/tools/textile/ können Sie Textile-Code in einem Textfeld eingeben und per Knopfdruck in HTML-Code umwandeln lassen. Dort ist auch eine Kurzreferenz enthalten. Eine ausführliche Referenz finden Sie auf der Website http://hobix.com/textile/ .
textilize_without_paragraph
Keine Tags für Absätze
Die Methode textilize_without_paragraph wandelt Textile-Code in HTML-Code um. Im Gegensatz zur Helper Methode textilize werden keine p -Tags für Absätze ausgegeben.
Listing Beispiel zu textilize_without_paragraph
textilize_without_paragraph('"Rails":http://www.rubyonrails.de
ist ein *super* Framework')
=> <a href="http://www.rubyonrails.com">Rails</a>
ist ein <strong>super</strong> Framework
Helper zur Entfernung von HTML-Code 

Die folgenden Helper sind für die Sicherheit Ihrer Rails-Applikation besonders wichtig, weil Sie sie einsetzen können, um HTML-Tags, Links etc. aus Benutzereingaben zu entfernen, die z. B. in ein Formular eingegeben wurden.
sanitize
Um alle Attribute aus HTML-Tags, die nicht explizit erlaubt sind, und alle JavaScript-Aufrufe innerhalb von href - und src -Attributen zu entfernen, eignet sich der Helper sanitize:
sanitize('<a href="javascript:meineFunktion()">Rails</a>
ist ein super Framework')
=> <a>Rails</a> ist ein super Framework
Befehle des ERB-Templatesystems |
Der Befehl html_escape() oder die Abkürzung h() entfernen hingegen nicht die HTML-Tags, sondern maskieren Tag-spezifische Zeichen wie < , > und & . Dadurch wird verhindert, dass eventuell bösartig eingegebene Befehle ausgeführt werden. Diese beiden Befehle sind keine Helper-Methoden, sondern sind Bestandteil des ERB-Templatesystems und können daher nur dort eingesetzt werden. |
strip_links
link-Tag entfernen
Mit Hilfe der Methode strip_links können Sie den gesamten Link-Tag entfernen. Nur der Link-Text wird noch zurückgegeben:
strip_links('<a href="http://www.rubyonrails.org">Rails</a>
ist ein super Framework')
=> Rails ist ein super Framework
strip_tags
HTML-Tags entfernen
Um alle HTML-Tags und HTML-Kommentare zu entfernen, eignet sich der Helper strip_tags:
strip_tags('<a href="http://www.rubyonrails.org">
Rails</a> ist ein <strong>super</strong> Framework')
=> Rails ist ein super Framework
Sonstige Helper 

cycle
Erstellt ein cycle -Objekt, das bei jedem Aufruf über die Elemente eines Arrays iteriert. Das können Sie zum Beispiel nutzen, um in einer Tabelle auf die Zeilen zwei unterschiedliche CSS-Klassen im Wechsel anzuwenden. Durch Übergabe des optionalen Parameters :name => name_des_cycle_objekts können Sie das cycle -Objekt benennen:
<% @items = [1,2,3] %>
<table>
<% @items.each do |item| %>
<tr class=«%= cycle('even', 'odd') %>">
<td>item</td>
</tr>
<% end %>
</table>
Daraus wird folgender HTML-Code generiert:
<table>
<tr class="even">
<td>item</td>
</tr>
<tr class="odd">
<td>item</td>
</tr>
<tr class="even">
<td>item</td>
</tr>
</table>
reset_cycle
cycle-Objekt zurücksetzen
Mit Hilfe der Methode reset_cycle können Sie ein cycle -Objekt zurücksetzen, so dass es beim nächsten Aufruf wieder mit dem ersten Wert beginnt. Wenn Sie die Methode auf ein benanntes cycle -Objekt anwenden möchten, übergeben Sie den Namen als Parameter:
<% @items = [1,2,3] %>
<table>
<% @items.each do |item| %>
<tr class=«%= cycle('red', 'green', :name => "colors") -%>">
<td>item</td>
</tr>
<% reset_cycle("colors") %>
<% end %>
content_tag
HTML-Tags erzeugen
Die Helper-Methoe content_tag wird allgemein wie folgt aufgerufen:
content_tag(name, content_or_options_with_block = nil,
options = nil, escape = true, &block)
Sie liefert einen HTML-Tag name zurück, der den übergebenen Inhalt (content) umschließt. HTML-Attribute können in einem Hash im Parameter options übergeben werden. Attribute ohne Werte werden im Hash mit dem Wert true übergeben. Sie können den Inhalt (content) der Methode auch als Block übergeben. In diesem Fall übergeben Sie die HTML-Attribute als zweiten Parameter. Der Parameter escape steht standardmäßig auf true . Wenn Sie false übergeben, werden die Werte der Attribute nicht maskiert:
content_tag(:p, "Hello world!")
=> <p>Hello world!</p>
content_tag(:div, content_tag(:p, "Hello world!"),
:class => "strong")
=> <div class="strong"><p>Hello world!</p></div>
content_tag("select", options, :multiple => true)
=> <select multiple="multiple">...options...</select>
<% content_tag :div, :class => "strong" do -%>
Hello world!
<% end -%>
=> <div class="strong"><p>Hello world!</p></div>
debug
Fehlersuche
Zur Fehlersuche ist die Methode debug sehr hilfreich. Dieser Helper gibt alle Werte eines Objekts aus, egal ob es sich dabei z. B. um ein Array, einen Hash oder ein komplexes ActiveRecord -Objekt handelt. Die Ausgabe erfolgt im YAML-Format:
person = {:firstname =>"Lee", :lastname=>"Adama"}
debug(person)
=>
<pre class='debug_dump'>---
:firstname: Lee
:lastname: Adama
</pre>"
debug in der Console |
In der Rails-Console gibt es den nützlichen Befehl
y , der im Prinzip das Gleiche macht wie die Methode
debug .
ruby script/console |
Im Abschnitt 8.5 werden weitere nützliche Helper vorgestellt. Wie Sie eigene Helper erstellen, zeigt der folgende Abschnitt.
Eigene Helper entwickeln 

Dem DRY-Prinzip folgend, soll gleicher Code nicht an mehreren Stellen vorkommen.
Nun möchten wir aber vielleicht einzelne Werte umformatieren, bevor wir sie ausgeben, oder aber wir erzeugen zum Beispiel an mehreren Stellen einer Applikation Zurück-Links zur Übersicht. Ändert sich an der URL dieser Links etwas, müssen wir das in allen Templates ändern.
app/helpers
Damit das nicht passiert, können wir uns für diese Aufgaben Methoden schreiben, die wir als Hilfsmethoden an eine zentrale Stelle auslagern. Diese sogenannte Helper-Methoden stehen dann als Modul zur Verfügung. Bei der Generierung eines Controllers erstellt Rails automatisch eine Helper-Datei im Verzeichnis app/helpers, deren Name sich aus dem Controllernamen und dem Suffix _helper zusammensetzt.
Die Methoden, die innerhalb dieser Helperdatei definiert werden, stehen jedem View zur Verfügung.
Beispiel
In unserem Beispielprojekt employees aus dem Kapitel »Erste Schritte« (siehe Kapitel 3) finden wir im Verzeichnis app/helpers die Helperdatei employees_helper.rb:
module EmployeesHelper
end
In dieser Datei können wir eine Methode definieren, die uns einen Zurück-Link zur Übersicht generiert:
module EmployeesHelper
def back_to_list
link_to "Zurück zur Liste", employees_path
end
end
In unserer Template-Datei new.html.erb können wir z. B. die Helper-Methode back_to_list einsetzen:
Listing app/views/employees/new.html.erb
<h1>New employee</h1>
<%= error_messages_for :employee %>
<% form_for(@employee) do |f| %>
...
<% end %>
<%= back_to_list %>
Alle Helper stehen jedem View zur Verfügung |
In Rails 2 werden automatisch alle Helper-Methoden von allen Helper-Dateien geladen und stehen den Views zur Verfügung. Es spielt daher keine Rolle, in welcher Helper-Datei eine Methode definiert wurde. Es werden auch Helper-Dateien geladen, die keinem Controller entsprechen. Es ist z. B. sehr praktisch, eine Helper-Datei anzulegen, die alle Formatierungs-Methoden Ihres Projektes in einer gemeinsamen Datei (z. B. format_helper.rb ) zusammenfasst. Sollen hingegen nicht alle Helper automatisch geladen werden, so müssen Sie nur die Zeile helper :all aus dem Application-Controller in der Datei app/controllers/application.rb entfernen. |
Mit Helper-Methoden können wir also Hilfsfunktionen, die für uns etwas generieren, auslagern, damit unsere Views so wenig Ruby-Code wie möglich enthalten.
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.