Domanda

Sto avendo un modello abbastanza complesso con molti campi, has_many , immagini aggiunte da image_column ecc ...

Il nuovo oggetto verrà aggiunto da un modulo multipagina (8 passaggi) - Come devo ottenere la convalida e la propagazione tra questi passaggi?

Penso che validation_group potrebbe essere utile per definire le validazioni per ogni passaggio, che dire del design complessivo?

È stato utile?

Soluzione

Per la progettazione complessiva, potresti voler esaminare il concetto di un livello Presenter (Jay Fields lo definisce nel suo blog Rails: Presenter Pattern ) come un modo per mantenere i controller sottili e vedere stupidi quando si tratta di modelli complessi / multipli.

Altri suggerimenti

Potresti avere una serie di metodi, ad es. step_1 , step_2 e ognuno verifica che siano stati inviati i dati necessari del passaggio precedente. È possibile archiviare i dati nella sessione in modo che, ad esempio, il passaggio 3 abbia comunque accesso a tutti i dati raccolti e analizzati nel passaggio 1. Nel passaggio finale, inserire tutti i dati memorizzati nella sessione più i dati dal penultimo passaggio da utilizzare e creare una nuova riga nel database o qualunque cosa tu stia raccogliendo i dati. Se un utente sbaglia un passaggio, reindirizzalo al passaggio precedente e compila il modulo con i dati che ha compilato; per esempio. se l'utente sbaglia il passaggio 2 e invia il modulo che conduce al passaggio 3, individua il problema nel tuo metodo step_3 , reindirizza l'utente al metodo step_2 e assicurati che il gli elementi del modulo nel passaggio 2 sono precompilati.

Se non si desidera archiviare i dati nella sessione mentre si procede, è possibile creare una nuova riga del database dopo che l'utente ha inviato il passaggio 1 e aggiornare semplicemente i campi in quella riga mentre si raccolgono nuovi dati in ogni passaggio successivo . Potresti avere un flag per 'complete' sulla riga, impostandolo inizialmente su 0 e quindi impostandolo su 1 dopo che l'utente ha completato con successo tutti i passaggi.

Potresti anche consentire agli utenti di andare ai passaggi precedenti (ad es. consentire all'utente di tornare al passaggio 3 quando si trova al passaggio 5).

Supponi che il tuo primo passo abbia un modulo con i campi 'nome' ed 'email'. Nel tuo metodo step_2 , devi verificare che params [: name] e params [: email] siano stati passati e siano validi. Archivia quelli nella sessione o in una riga del database, comunque tu abbia scelto. Quindi, al passaggio 2, hai un modulo con i campi 'età' e 'genere'. Nel tuo metodo step_3 , dovresti verificare che params [: age] e params [: gender] siano stati passati e siano validi e tu è necessario assicurarsi che l'utente abbia completato il passaggio 1, per impedire a un utente di immettere l'URL per accedere direttamente al passaggio 3. E così via.

class Campaign < ActiveRecord::Base
    with_options(:if => lambda { |campaign| campaign.on_or_past_step(:spam_can) }) do |spam_can|
      spam_can.validates_associated  :spam_can
      spam_can.validates_presence_of :spam_can
    end
  def on_or_past_step
   :
   :
  end
end

questo è un work in progress, ma mi sento come se fossi sulla buona strada. Sto usando gli stati AASM per determinare quali validazioni eseguire. Non ho ancora capito come dovrebbero funzionare le rotte, dato che il modello in questione nel mio caso è una risorsa. ad esempio, quale gruppo di campi dovrebbe essere l'azione di modifica?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top