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
Projectpuò essere creato daadminofacultyutenti. - dopo l'invio,
facultynon può aggiornare alcuni attributi del loroProject. -
studentutenti possono visualizzare il progetto a cui partecipano, ma non possono aggiornare alcun attributo (solo visualizzazione). -
nuovo
Projectdovrebbe nascondere alcuni campi che sono visibili nell'azione mostra , perché questi campi vengono aggiornati da unadmindopo 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.