Esiste un modello migliore per un oggetto modulo che si popola in 3 modi diversi?

1

Quindi sto scrivendo un oggetto modulo che si occupa di una cosa specifica - il prezzo - che sarà incluso in diverse risorse sottostanti. (Il prezzo è un modello separato che può o non può essere necessario creare / aggiornare con la risorsa sottostante che belongs_to , questo 'oggetto modulo prezzi' gestisce questa logica).

Si popola in tre modi diversi:

  • Quando istanziato per mostrare un modulo edit per una risorsa esistente, si popola usando i dati dalla risorsa.

  • Quando istanziato per mostrare un modulo new per una risorsa non ancora esistente, si popola automaticamente con alcune impostazioni predefinite.

  • Quando viene istanziato per salvare un modulo (su create o update ), si popola con i parametri del modulo.

Quindi, leggermente semplificato:

def initialize(resource: nil, params: {})
  @resource = resource
  if params.empty?
    resource.price.nil? ? set_defaults : set_from_resource
  else
    set_from_params(params)
  end
end

Funziona bene. Ed è bello e ASCIUTTO - la maggior parte della logica può essere condivisa tra i tre casi.

Ma ... sembra un po 'strano, sai? Avere un singolo oggetto si popola in molti modi diversi a seconda del compito che deve svolgere. Non è un modello che ho visto molto altrove, il che mi preoccupa se c'è una ragione per questo.

Una possibile cosa sarebbe dividerlo in un oggetto modulo e un oggetto servizio prezzo. Ma questo non sembra che possa risolvere il problema. Per prima cosa, non posso fare in modo che l'oggetto form si popoli solo dalla risorsa (lasciando che il servizio populi dai parametri e salvi nella risorsa), poiché l'oggetto form deve essere compilato dai parametri nel caso di un errore salva, poiché il modulo viene nuovamente visualizzato. Per un altro, l'oggetto modulo ha bisogno di accedere a qualsiasi errore impostato sul modello Prezzo in fase di salvataggio, quindi può mostrarlo all'utente - che è semplice al momento (posso clonare gli errori dal modello di prezzo all'oggetto del modulo) , ma con un oggetto di servizio Price l'oggetto modulo dovrà richiederne gli errori. O duplicherò gran parte della logica, o i due oggetti finiranno così strettamente accoppiati che sarebbe stato inutile separarli.

C'è uno schema che mi manca che risolva in modo elegante? O dovrei smettere di preoccuparmi di popolare un oggetto in molti modi diversi?

    
posta Simon Woolf 12.03.2015 - 17:30
fonte

2 risposte

1

L'origine dei dati per compilare il modulo dovrebbe sempre essere un oggetto di dominio (ciò che si chiama una "risorsa"). Non sono sicuro di come Ruby on Rails si occupa di questo, ma io sono sicuro che RoR abbia già una soluzione. Probabilmente va qualcosa del genere:

  • Quando viene istanziato per mostrare un modulo di modifica per una "risorsa" esistente, si popola automaticamente usando i dati dalla risorsa.

  • Quando istanziato per mostrare un nuovo modulo per una risorsa non ancora esistente, si popola da sé usando una risorsa appena creata, già popolata con alcune impostazioni predefinite.

  • Quando istanziato per salvare un modulo (in fase di creazione o aggiornamento) ... Beh, questo è già coperto dai primi due punti elenco.

Quindi non ci sono tre modi per compilare il modulo. Ce n'è solo uno.

    
risposta data 12.03.2015 - 18:06
fonte
0

Se ti capisco correttamente, potresti voler suddividere il tuo modulo in componenti più piccoli e più modulari. È quello che stai dicendo è che un pezzo del tuo modulo verrà aggiornato o modificato? In tal caso, è possibile avere un relatore distinto responsabile del collegamento di tale risorsa / modello alla vista.

    
risposta data 12.03.2015 - 18:57
fonte