Ruby on Rails: Tipps - View
Ruby Code im View vermeiden
BearbeitenProblem
BearbeitenRuby 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
BearbeitenOft ist der Code im Model besser aufgehoben.
Beispiel: CSS-Auswahl von View ins Model verlagern
BearbeitenEine 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
BearbeitenGenerell 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
BearbeitenProblem
BearbeitenDie Zeilen einer Tabelle sollen abwechselnde Hintergrundfarben erhalten.
Lösung
BearbeitenDas Modul ActionView::Helpers::TextHelper bietet mit der cycle-Funktion einen Generator für zyklische Werte an.
Beispiel
BearbeitenEine 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.