Qual è il modo più Rails'ish di gestire layout multipli / viste per la stessa azione di controllo?
-
03-10-2019 - |
Domanda
Lo scenario è questo:
Ho alcuni utenti sul mio sito. Un utente ha un ruolo, quelli rilevanti qui è admin
e normal
. Ho anche un modello, chiamiamolo SomeModel
.
Ho creato un backend per il sito, che utilizza un Ammin layout. Tutti gli amministratori hanno pieno accesso a modificare qualsiasi contenuto.
Il problema si pone con questa relazione: Utente -> possiede -> SomeModel . Ciò significa che un amministratore non utente può possedere un'istanza di SomeModel
e dovrebbe essere in grado di modificare i dati di questa istanza.
Il controller per SomeModel
ha una modifica azione che poi si rivolge sia gli amministratori e gli utenti regolari.
Tuttavia, non voglio che gli utenti regolari seing il Ammin il layout e in questo momento, il mio modo di fare questo è in questo modo:
if current_user.admin?
render :layout => 'admin'
end
che per default è il layout standard, se l'utente non è un amministratore. Ho questo in tutte le mie azioni per SomeModel
e semplicemente non mi sembra un modo molto Rotaie di fare le cose.
C'è un modo migliore?
Soluzione
Si può fare questo a livello di controller:
class MyModelController < ActionController::Base
layout :user_or_admin_layout
def index
# fetching objects
end
private
def user_or_admin_layout
current_user.admin? ? "admin_layout" : "user_layout"
end
end
Ci sono altri esempi nella documentazione rotaie per Layout