Ruby on Rails: Tipps - View

Aus Wikibooks

Ruby Code im View vermeiden[Bearbeiten]

Problem[Bearbeiten]

Ruby Code im View wird schnell unübersichtlich.

  • keine Modularisierung über Methodenaufrufe
  • Codeduplikation oder zusätzliche Partials wenn der Code mehrfach benötigt wird
  • Wüsche an Code-Einrückung und HTML-Einrückung widersprechen sich

Besonders kritisch sind if-else Abfragen.

Lösung[Bearbeiten]

Oft ist der Code im Model besser aufgehoben.

Beispiel: CSS-Auswahl von View ins Model verlagern[Bearbeiten]

Eine typische Situation im View. Je nachdem ob das Menü-Item gerade aktiv ist oder nicht, soll der Item-Text verschieden dargestellt werden.

# views/layouts/display_seite.html.erb

<div id="menu">
<% @pages.each do |p| %>
  <% if (p.id == @page.id)
    <a href="<%= p.id %>" class="active"><%= p.menu %></a>
  <% else %>
    <a href="<%= p.id %>" class="passive"><%= p.menu %></a>
  <% end %>
<% end %>
</div>

Nicht gerade übersichtlich. Wenn wir das jetzt erweitern und Styles für sagen wir 3 Menüebenen einführen (active_1, acive_2, active_3, passive_1, passive_2, passive_3) bekommen wir einen Dschungel aus 6 if-else Abfragen, der kaum noch zu durchschauen ist. Da hilft auch keine Brille.

Viel besser ist der Code im Model aufgehoben.

# models/page.rb

  # decide the menu style for the current page -self- 
  # when we know the activ page -parameter-
  def menu_style(active_page)
    id == active_page.id ? "active" : "passive" 
  end
# views/layouts/display_seite.html.erb

<div id="menu">
<% @pages.each do |p| %>
  <a href="<%= p.id %>" class="<%= p.menu_style(@page)%>"><%= p.menu %></a>
<% end %>
</div>

Wenn wir die Menueebenen angehen, ergänzen wir den Code im Model, der View-Code bleibt. Das ist klarer und - by the way - auch leicht zu testen.

Hinweise[Bearbeiten]

Generell gilt "thin view" - "thin controller" - "fat model" als good practice. Im Model kann man den Code modular aufbauen, er ist besser wiederverwertbar und besser zu testen.

Allerdings kann man es auch übertreiben. Redermethoden die komplexes HTML erzeugen sind ein Warnsignal. Dann ist vielleicht zu viel ins Model gewandert. Oft sind Partials dann die bessere Lösung. HTML gehört in den View. Und Partials sind auch wiederverwertbar.

Zyklische und alternierende Zeilenformatierung[Bearbeiten]

Problem[Bearbeiten]

Die Zeilen einer Tabelle sollen abwechselnde Hintergrundfarben erhalten.

Lösung[Bearbeiten]

Das Modul ActionView::Helpers::TextHelper bietet mit der cycle-Funktion einen Generator für zyklische Werte an.

Beispiel[Bearbeiten]

Eine Tabelle erhält abwechselnd rote, grüne und blaue Zeilen.

<table>
	<% for row in ['Zeile 1', 'Zeile zwei', 'Dritte Zeile', 'Vorletzte Zeile', 'Letzte Zeile' ]%>
	<tr style="background-color: <%= cycle 'red', 'green', 'blue' %>;">
		<td><%= row %></td>
	</tr>
	<% end %>
</table>

So sieht es aus:

Zeile 1
Zeile zwei
Dritte Zeile
Vorletzte Zeile
Letzte Zeile

Hinweise[Bearbeiten]

  • Im allgemeinen sollten Stilvorlagen verwendet werden.
  • Der erste Parameter ist der Startwert.
  • Bei verschachtelten cycle-Anweisungen sollten diesen ein Name gegeben werden (:name => 'xyz') und der Generator sollte manuell mit reset_cycle zurückgesetzt werden.