Sono in procinto di scrivere un'applicazione web Ruby on Rails per il dipartimento della mia università.
Per alcune delle nostre risorse nell'applicazione web, ad es. Project
, sono complessi con la loro logica del livello di vista:
- a
Project
può essere creato daadmin
ofaculty
utenti. - dopo l'invio,
faculty
non può aggiornare alcuni attributi del loroProject
. -
student
utenti possono visualizzare il progetto a cui partecipano, ma non possono aggiornare alcun attributo (solo visualizzazione). -
nuovo
Project
dovrebbe nascondere alcuni campi che sono visibili nell'azione mostra , perché questi campi vengono aggiornati da unadmin
dopo l'invio del modulo - molte più regole ...
Attualmente ho un singolo modulo per ogni tipo di azione: nuovo , mostra e modifica . Il problema è che le regole aziendali sono presentate nelle viste in un modo molto complesso. Inizialmente l'ho fatto per evitare di avere un modulo separato per ogni utente (che il controller effettuerebbe il rendering in base al role
dell'utente), che aveva un sacco di duplicazione del codice. La logica di business diventerà sempre più complicata nel tempo, rendendo l'approccio a modulo singolo più complesso da sviluppare e mantenere. Ma allo stesso tempo, separare i moduli in role
di viste specifiche provoca un aumento della duplicazione del codice.
Quindi, alla domanda. La creazione di moduli separati per ogni utente role
avrebbe senso, dato che sarebbe essenzialmente una duplicazione del codice del 50%? Esiste una soluzione migliore?
Gli effettivi attributi permessi da aggiornare sono effettivamente controllati tramite Rails strong parameters e la gemma Pundit che consente di esplorare le risorse basate sulle regole (come User.role
). Quello di cui sto parlando è solo il livello di presentazione .
Per inciso, ho già provato a lavorare con partial per campi di moduli condivisi; tuttavia, alla fine devo spostare il campo x
o y
fuori dal partial e tornare nel complicato modulo singolo perché alcune regole aziendali cambiano per limitare l'accesso a determinati campi a determinati ruoli.
Ho anche esaminato questa domanda MVC che è abbastanza simile, ma è ASP.NET che potrebbe avere una differenza nel modo in cui queste regole potrebbero essere separate dalla vista; Non ho mai lavorato con ASP.NET quindi non lo so. Anche questa domanda generale su MVC non rispondo alla mia domanda; le mie regole aziendali sono già presenti nei miei modelli e attraverso la gemma Pundit; tuttavia, il modo migliore per presentare questi dati non è discusso.