Aumentare la duplicazione del codice per semplificare le regole aziendali nelle viste

5

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 da admin o faculty utenti.
  • dopo l'invio, faculty non può aggiornare alcuni attributi del loro Project .
  • 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 un admin 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.

    
posta Chris Cirefice 21.02.2016 - 20:45
fonte

1 risposta

1

In generale, vuoi che le tue regole aziendali vengano gestite nei tuoi controllori o (ancora meglio) nei tuoi modelli. Il codice di visualizzazione dovrebbe occuparsi solo della visualizzazione delle informazioni.

Personalmente, uso la gemma di Cancan per gestire l'autenticazione dell'utente. Potrebbe essere un buon punto di partenza per te. (Anche se sembra che tu debba fare qualche refactoring.) link

Inoltre, non sto capendo appieno il tuo caso d'uso per quanto riguarda i partial, ma raramente c'è un motivo per duplicare il codice. Renditi conto che puoi passare i parametri in partial: link

Con questo in mente, non dovresti davvero dover duplicare alcun codice. Questo è un grande odore di codice. Se ti ritrovi a farlo, di solito significa che dovresti ripensare parte del tuo design.

Spero che ti aiuti

    
risposta data 17.03.2016 - 17:18
fonte