Può succedere di dover utilizzare template grafici diversi per metodi differenti di uno stesso controller. In prima analisi verrebbe da implementare una soluzione che prevede una chiamata esplicita al layout da utilizzare all’interno di ogni singola action.
Qualcosa del tipo:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class PostController < ApplicationController
def index
[...]
:layout => 'standard'
end
def show
[...]
:layout => 'standard'
end
def new
[...]
:layout => 'admin'
end
def edit
[...]
:layout => 'admin'
end
end
Esiste però un modo più semplice e DRY di implementare la stessa soluzione. Per selezionare il layout corretto da utilizzare Rails cerca una action chiamata “choose_layout”.
Definendo la propria versione di “choose_layout” è possibile gestire banalmente la scelta del layout come potete vedere nel codice che segue:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class PostController < ApplicationController
layout :choose_layout
def index
[...]
end
def show
[...]
end
def new
[...]
end
def edit
[...]
end
private
def choose_layout
if [ 'new', 'edit' ].include? action_name
'admin'
else
'standard'
end
end
end
Questa action utilizza la variabile Rails action_name che contiene il nome dell’action corrente per decidere quale layout caricare.
Quindi se action_name vale ‘new’ o ‘edit’ verrà caricato il layout ‘admin‘, altrimenti per qualsiasi altra action verrà caricato il layout ‘standard‘.