8.4 Layouts 

Mehrseitige Websites enthalten immer Designelemente, die auf allen Seiten oder zumindest auf den meisten Seiten vorkommen. Damit Sie den entsprechenden Code nicht in allen Templates einfügen müssen, was auch dem DRY-Prinzip widersprechen würde, können Sie ihn in Layout-Dateien auslagern.
application. html.erb
Eine Layout-Datei können Sie im Verzeichnis app/views/layouts anlegen. Sie nennen sie entweder wie einen Ihrer Controller (wie z. B. flights.html.erb für den Flights-Controller), dann wird dieses Layout automatisch auf alle Views zu dem entsprechenden Controller angewendet, oder Sie nennen die Datei application.html.erb, dann wird sie automatisch auf alle Views der Applikation angewendet.
yield
Innerhalb der Layout-Datei müssen Sie an der Stelle, an der der Quelltext aus den Templates eingefügt werden soll, yield aufrufen:
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>
<p style="color: green"><%= flash[:notice] %></p>
<%= yield %>
</body>
</html>
Alle Instanzvariablen, die im Controller gesetzt werden, stehen in der Layout-Datei zur Verfügung.
layout "admin"
Wenn Sie auf die Views eines Controllers ein anderes Layout als sein eigenes oder das der application.html.erb anwenden möchten, müssen Sie das im Controller über den Aufruf der Methode layout, der Sie den Namen des Layouts ohne Dateiendung übergeben, deklarieren. Hätten wir zum Beispiel ein Layout app/views/layouts/admin.html.erb definiert, das wir für die Views des Controllers Employees-Controller nutzen wollten, müssten wir Folgendes im Controller deklarieren:
class EmployeesController < ApplicationController
layout "admin"
...
end
:only
Wenn Sie ein Layout nur auf bestimmte Views anwenden möchten, können Sie die Option :only verwenden:
class EmployeesController < ApplicationController
layout "admin", :only => [:edit, :new]
...
end
:except
Um hingegen das Layout auf alle Views, bis auf ein paar Ausnahmen, festzulegen, verwenden Sie die Option :except:
class EmployeesController < ApplicationController
layout "admin", :except => [:index, :show]
...
end
Bei einem Element kann das Array auch weggelassen werden, wie z. B.
layout "admin", :except => :index.
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.