Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort des Fachgutachters
Einleitung
1 Einführung
2 Installation
3 Erste Schritte
4 Einführung in Ruby
5 Eine einfache Bookmarkverwaltung
6 Test-Driven Development
7 Rails-Projekte erstellen
8 Templatesystem mit ActionView
9 Steuerzentrale mit ActionController
10 Datenbankzugriff mit ActiveRecord
11 E-Mails verwalten mit ActionMailer
12 Nützliche Helfer mit ActiveSupport
13 Ajax on Rails
14 RESTful Rails und Webservices
15 Rails mit Plug-ins erweitern
16 Performancesteigerung
17 Sicherheit
18 Veröffentlichen einer Rails-Applikation auf einem Server
Ihre Meinung?

Spacer
 <<   zurück
Ruby on Rails 2 von Hussein Morsy, Tanja Otto
Das Entwickler-Handbuch
Buch: Ruby on Rails 2

Ruby on Rails 2
geb., mit DVD
699 S., 39,90 Euro
Rheinwerk Computing
ISBN 978-3-89842-779-1
Online bestellenPrint-Version jetzt bestellen
* versandkostenfrei in (D) und (A)
Pfeil 8 Templatesystem mit ActionView
  Pfeil 8.1 ERB-Templates
  Pfeil 8.2 Erstellung von Templates
  Pfeil 8.3 Helper
  Pfeil 8.4 Layouts
  Pfeil 8.5 Formulare
  Pfeil 8.6 Partials
  Pfeil 8.7 Alternative Template-Systeme


Rheinwerk Computing - Zum Seitenanfang

8.3 Helper  Zur nächsten ÜberschriftZur vorigen Überschrift

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"
=> «a href= "mailto:lee@adama.com »lee@adama.com</a>"

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.


Rheinwerk Computing - Zum Seitenanfang

Helper für Verlinkungen  Zur nächsten ÜberschriftZur vorigen Überschrift

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="&#109;&#97;&#105;&#108;&#116;...">
&#108;&#101;&#101;&#64;&#97;...;</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" />

Rheinwerk Computing - Zum Seitenanfang

Helper zum Einbinden von Stylesheets und JavaScripts  Zur nächsten ÜberschriftZur vorigen Überschrift

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).


Rheinwerk Computing - Zum Seitenanfang

Helper zur Zahlenformatierung  Zur nächsten ÜberschriftZur vorigen Überschrift

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)
Beispiel zu number_with_delimiter
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

Rheinwerk Computing - Zum Seitenanfang

Helper zur Textmanipulation  Zur nächsten ÜberschriftZur vorigen Überschrift

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

Rheinwerk Computing - Zum Seitenanfang

Helper zur Textformatierung  Zur nächsten ÜberschriftZur vorigen Überschrift

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

Rheinwerk Computing - Zum Seitenanfang

Helper zur Entfernung von HTML-Code  Zur nächsten ÜberschriftZur vorigen Überschrift

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

Rheinwerk Computing - Zum Seitenanfang

Sonstige Helper  Zur nächsten ÜberschriftZur vorigen Überschrift

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
person = {:firstname =>"Lee", :lastname=>"Adama"}
>> y person
=>
---
:firstname: Lee
:lastname: Adama

Im Abschnitt 8.5 werden weitere nützliche Helper vorgestellt. Wie Sie eigene Helper erstellen, zeigt der folgende Abschnitt.


Eigene Helper entwickeln  topZur vorigen Überschrift

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.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
 <<   zurück
  Zum Katalog
Zum Katalog: Ruby on Rails 2
Ruby on Rails 2
Jetzt bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Ruby on Rails 3.1






 Ruby on Rails 3.1


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Suchmaschinen-Optimierung






 Suchmaschinen-
 Optimierung


Zum Katalog: JavaScript






 JavaScript


Zum Katalog: Schrödinger lernt HTML5, CSS3 und JavaScript






 Schrödinger lernt
 HTML5, CSS3
 und JavaScript


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de