2013-02-07 4 views
19

Non riesco a capire il flusso di lavoro che verrebbe utilizzato nel seguente scenario:Cosa si può fare con i modelli di dati di metallo quando sono nello stato di errore?

Un utente crea un modello, chiamiamolo Prodotto. Presentiamo loro un modulo da compilare. Gli errori di salvataggio per qualche motivo diverso dalle convalide (timeout, accesso negato ecc.) In Ember, questo mette il modello in uno stato di errore. Dal punto di vista dell'interfaccia utente, tutto ciò che voglio fare è mettere un messaggio sullo schermo (facile) e consentire all'utente di riprovare (apparentemente non così facile).

L'ho visto scrivere molte volte per non riutilizzare una transazione. Capisco la logica di ciò. Nel caso di un nuovo prodotto, creo semplicemente un altro nuovo prodotto, unisco i dati del prodotto originale (attributi, relazioni) e sostituisco il contenuto del mio controller con il nuovo prodotto. Questo non è stato difficile e sembra funzionare bene, sebbene ci possa essere (si spera) in un modo migliore.

Tuttavia, quando si modifica un prodotto, si è verificato un problema grave e la soluzione di cui sopra non funziona. Il modello di prodotto è ora nello stato di errore e non riesco a trovare alcun modo per ottenere una copia di questo prodotto che non si trovi nello stesso stato.

Quello che non riesco a capire è cosa posso fare con questo modello una volta che ha raggiunto lo stato di errore. Ho provato il seguente:

Rollback: Questo non funziona. Non è possibile eseguire il rollback di una transazione nello stato di errore.

Ricarica: Come sopra. Non è consentito ricaricare un record nello stato di errore.

Prendere una nuova copia del record: Così provo App.Product.find (id) con lo stesso id del record esistente. Mi dà solo una copia del record esistente, nello stato di errore.

Spero di perdere qualcosa di abbastanza semplice qui. È possibile eseguire correttamente il roll out di un record da uno stato di errore (o da uno stato non valido)?

Se esiste un modo semplice per modificare lo stato di questi modelli, dovremmo ancora creare una nuova transazione per ulteriori tentativi di commit?

+0

Dai un'occhiata a questo thread e questo modello. http://stackoverflow.com/a/16471974/1330615 – danielgatis

+0

Dai un'occhiata a questo thread e questo modello. http://stackoverflow.com/a/16471974/1330615 – danielgatis

+1

@danielgatis Ho dato un'occhiata al vostro succo, che è legata al dal link che hai postato ... vedo il motivo per cui il vostro modello funziona per un nuovo record mentre semplicemente distruggi il fallito e ne crei uno nuovo quando non lo convalida. Non ti fa perdere i dati inseriti dall'utente? Inoltre, questo non funzionerà per modificare i record esistenti. Infine c'era bisogno di postare il tuo commento tre volte su questa domanda? –

risposta

13

Quindi, dopo alcuni giorni di lettura e sperimentazione, sono giunto alla conclusione che questa è una funzionalità che non è ancora stata implementata. Per spostare un record in un altro stato è necessario inviare un evento ad esso che lo passa sullo statemanager. Sembra che non ci siano eventi registrati nello stato di errore che ci consente di recuperare il record.

C'è una brutta soluzione: posso chiamare transitionTo sullo statemanager del record e forzarlo nello stato che vogliamo. Non ho deciso di farlo alla leggera, ma a questo punto devo continuare il progetto mentre aspetto che i dati di bordo si evolvano. Quindi, se il record è finora salvato, si può salvare da uno stato non valido o un errore chiamando:

model.get('stateManager').transitionTo('loaded.created.uncommitted')

o per un record esistente:

model.get('stateManager').transitionTo('loaded.updated')

Una volta che questo è stato chiamato, è possibile tentare di richiamare nuovamente il commit sulla transazione in cui si trova il modello. Questa sarà la transazione predefinita poiché il comportamento di ember-data consiste nel spostare un modello nella transazione predefinita dopo che il commit è stato richiamato sulla sua transazione originale. È sempre possibile recuperare la transazione corrente per un modello chiamando model.get('transaction')

Quindi, alla fine, ho un modo per creare lo scenario CRUD tipico che potremmo vedere in Ruby on Rails, ma non ci credo è il modo ideale per farlo. Credo tuttavia che in questo momento, nemmeno il team di ember-data.

Per quelli di voi interessati ad avere la funzionalità CRUD come controller e route mixin per Ember, ho un Gist che contiene il codice I cam attualmente in uso. Funziona bene, recupera gli errori di salvataggio e gli errori di convalida. Spero di poter continuare a perfezionarlo man mano che i dati di ember si evolvono.

+1

Grazie per il tuo codice. Tuttavia, mi sembra di avere una condizione di gara quando si utilizza il codice dal gist; forza lo stato prima che l'evento 'lifecyclecallback' sia stato inviato e, quando lo fa, diventa non gestito (lo stato caricato non gestisce quell'evento). Le versioni recenti di ember errano quando gli eventi non sono stati elaborati. – bouke

+0

Ciao! Dai un'occhiata a questo thread e questo schema. http://stackoverflow.com/a/16471974/1330615 – danielgatis

0

David,

Si potrebbe provare a creare una rappresentazione parallela di modello come un Ember.Object che non viene mantenuto, ma ha le stesse proprietà del vostro modello persistente. Se la tua ajax rimbalza in uno stato di errore puoi usare la callback di errore fornita dal metodo ajax per fare qualcosa.

In questo caso, il "qualcosa" potrebbe essere quello di eliminare il record e quindi clonare le proprietà dall'oggetto fittizio in un nuovo record e salvare nuovamente il record. In caso di una richiamata riuscita, distruggi semplicemente il tuo oggetto temporaneo e se tutti i record sono puliti, cancella i tuoi oggetti temporanei (per evitare oggetti temporanei persistenti).

Questo potrebbe anche essere folle ... ma mi sembra un'opzione.

Steve

+1

Ciao Steve, Apprezzo il tuo tentativo di rispondere alla domanda, purtroppo la soluzione non è realistica. Anche se mi sono preso la briga di creare un oggetto parallelo, il fatto che il modello di Ember sia ancora nel suo stato di errore mi impedisce di cancellarlo. Quindi, dato il nuovo oggetto, non posso ancora usare Ember Data per salvarlo o aggiornarlo. Inoltre, come nota a margine, non mi piacerebbe eliminare le cose da un'API solo per poterle ricreare. Non è un buon modo per gestire i dati. L'utilizzo di plain JS e Ajax risolverà qualsiasi problema. La domanda è come dovrebbe essere fatto con i dati di brace. –

2

È possibile attivare un evento becameValid su di esso:

record.send("becameValid"); 

Questo dovrebbe passare il modello da impegnati Stato.

+2

Questo non funziona quando un modello si trova nello stato di errore. –