MVC - Verifica dei dati nel modello o nel controller?

4

Attualmente sto creando un'applicazione web con Ruby on Rails e sto affrontando un problema concettuale relativo al pattern MVC.

Se devo controllare, ad esempio, se il nome di un dato che voglio aggiungere nel database esiste in un dato array, dove devo farlo? Nel controller o nel modello?

Ho letto ovunque che il modello deve occuparsi solo delle informazioni del database, quindi suppongo che sia il lavoro del controllore.

Ma con Rails il modello sembra fare più cose come la convalida dei dati (validate,: presence ...) quindi mi chiedo se è finalmente il modello che lo fa?

Se si tratta del lavoro del modello, significa che ho bisogno di passare un attributo controller al modello (l'array proviene da un'API), è strano?

Come richiesto ti fornisco ulteriori dettagli:

La mia applicazione ottiene un elenco di elementi da un'API. Includo questo elenco in un modulo (come in un tag select) e quindi quando il modulo viene inviato ottengo l'id dell'elemento selezionato per aggiungerlo infine nel database con altre informazioni dal modulo.

Prima di aggiungere i dati al database voglio solo essere sicuro che l'id dell'elemento sia valido (ecco perché devo verificare se è presente o meno nell'array - nel caso in cui l'utente modifichi manualmente l'HTML dal suo browser ...).

    
posta gaetanm 29.04.2015 - 13:52
fonte

5 risposte

5

Questo è davvero un dibattito antico. Torna ai primi database e alla nozione di "integrità referenziale", che a sua volta è una variazione del dibattito sulla tipizzazione strong / debole.

Chi è il lavoro per assicurarsi che i dati siano archiviati in modo coerente e "noto bene"? I puristi di MVC ti diranno che è il lavoro del controllore. Gli architetti di database ti diranno che è il lavoro del modello (o anche il lavoro del database). Le persone Ux potrebbero anche dirti che è il lavoro della vista! I Big Data potrebbero dire "È la persona che usa il lavoro dei dati."

Dopo essere stato un ingegnere del software / architetto / sviluppatore per oltre 20 anni, sono giunto alla conclusione che spesso la preoccupazione è importante, ma come la risolvi è meno importante, purché decidi su un approccio e mantenerlo. Quindi, il mio consiglio sarebbe qualcosa di simile: piuttosto che chiedere le opinioni della gente sul dogma su di esso, pensa attraverso la risoluzione del "chi possiede la validazione?" discussione utilizzando tre diversi approcci: modello, vista e controllore. Pensa a come si comporterà la tua app se la risolvi in tre modi diversi. I tuoi utenti finali saranno soddisfatti di tutti e tre gli approcci? È probabile che, a seconda di dove lo metti, i tuoi utenti finali sperimenteranno qualcosa di diverso. Hanno un'opinione? Inoltre, quale percorso ti costa di più in termini di tempo e denaro? Quale sarà più facile mantenere e spiegare a nuove persone? E riguardo la sicurezza? Tutte queste cose sono considerazioni importanti quando si progetta un sistema e le risposte dogmatiche non tengono conto di queste cose - sostituiscono un modello comune per il proprio contesto preciso. A volte è una buona idea, a volte è un disastro di corno di scarpe. Solo tu puoi capire quale si applica.

    
risposta data 29.04.2015 - 17:41
fonte
1

Prendi le massime come "il tuo modello si preoccuperà solo delle cose del database" con un pizzico di sale. Il dogma non ha spazio in ingegneria.

Per rispondere a questa domanda è necessario prima capire la natura di questo array di convalida e se si adatta concettualmente al modello o al controllo del modello.

Il fatto che questi nomi siano memorizzati all'interno di un array è irrilevante; potresti inviare i nomi a una porta seriale e ricevere risposte "sì" o "no" per tutto ciò che ti interessa. Questo potrebbe ancora legittimamente essere parte del tuo modello. La domanda è: il compito di convalida ti suona più come "controllare" il modello, o come interrogare il modello?

Non hai fornito abbastanza dettagli su questo misterioso array, ma sono tentato di credere che sia al 100% parte del modello. I nomi che contiene potrebbero essere stati facilmente archiviati nel database, ma per qualche motivo qualcuno ha deciso di non farlo. Se pensate strettamente al "modello" come "il database", potreste essere indotti in errore a pensare che non appartengono al modello, ma se vi rendete conto che il vostro modello è la vostra rappresentazione di tutte le vostre entità e le relazioni tra loro, allora forse potrebbe iniziare a dare un senso che il contenuto di quell'array stia semplicemente descrivendo una relazione che per qualche motivo non è stata codificata nel database.

Dopo l'emendamento alla domanda, direi con ancora più fiducia che l'elenco degli elementi (e quindi l'elenco dei loro id) è parte del modello, anche se non posso ancora dirlo con totale fiducia, poiché è ancora non mi è chiaro qual è la natura di queste entità e qual è il dominio che descrive il database.

Mi sembra, tuttavia, che quello che ti manca è un livello di astrazione che combina il database e l'API e qualsiasi altra cosa tu possa avere in un modello uniforme che sembra omogeneo e risparmia il resto del codice da dover essere preoccupato per le diverse fonti di diversi sottoinsiemi delle informazioni con cui lavora. Concettualmente, se queste entità hanno id, e questi ID sono memorizzati nel database, allora fanno tutti parte dello stesso modello, indipendentemente da dove provengono.

    
risposta data 29.04.2015 - 15:21
fonte
0

Un esempio di codice sarebbe d'aiuto, ma nelle guide, le convalide appartengono al modello. Controlla validates_inclusion_of .

Inoltre, dovresti sapere che i modelli non devono necessariamente essere supportati dalla persistenza. Ci sono molte volte quando è appropriato usare oggetti di rubino semplici. In generale, è meglio mantenere il maggior numero di funzionalità possibili dal controller, in gran parte perché i test dei controller sono spesso lenti da eseguire e difficili da scrivere.

    
risposta data 29.04.2015 - 15:45
fonte
0

Se vuoi solo verificare che il nome esista, sì, appartiene al modello.

Da wikipedia:

A controller can send commands to the model to update the model's state (e.g., editing a document). It can also send commands to its associated view to change the view's presentation of the model

Non stai facendo nessuno di questi. Stai verificando se il nome esiste già nel database. Pensalo come una validazione extra.

    
risposta data 29.04.2015 - 16:11
fonte
-1

IMHO e, a mio avviso, stai convalidando i dati dall'array dato, non dal database.

Quindi credo fermamente che dovresti farlo nel controller.

la regola generale è quella di scrivere solo le interazioni del database all'interno del modello.

    
risposta data 29.04.2015 - 13:55
fonte

Leggi altre domande sui tag