Rotaie nuove vs create


195

Perché è necessario definire un nuovo metodo nel controller RESTful, seguirlo con un metodo di creazione?

La ricerca di Google non mi ha fornito la risposta che cercavo. Capisco la differenza, ma ho bisogno di sapere perché sono usati così come sono.

Risposte:


263

Nell'ambito dell'implementazione di REST di REST, le novità e le creazioni vengono trattate in modo diverso.

Un HTTP GET to ha lo /resources/newscopo di rendere un modulo adatto alla creazione di una nuova risorsa, cosa che fa chiamando la nuova azione all'interno del controller, che crea un nuovo record non salvato e rende il modulo.

Un HTTP POST /resourcesprende il record creato come parte della nuova azione e lo passa all'azione di creazione all'interno del controller, che quindi tenta di salvarlo nel database.


1
Ho scremato esattamente queste informazioni in un sito di tutorial sulle rotaie. Non è stato fino a quando non lo uso effettivamente che diventa rilevante.
StorymasterQ

248

Dalla documentazione di ActiveRecord :: Base :

create (attributi = zero) {| oggetto | ...}

Crea un oggetto (o più oggetti) e lo salva nel database, se le convalide passano. L'oggetto risultante viene restituito indipendentemente dal fatto che l'oggetto sia stato salvato correttamente nel database o meno.

nuovo (attributi = zero) {| self if block_given? | ...}

I nuovi oggetti possono essere istanziati come vuoti (passa nessun parametro di costruzione) o preimpostati con attributi ma non ancora salvati (passa un hash con nomi di chiave corrispondenti ai nomi di colonna della tabella associata). In entrambi i casi, le chiavi di attributo valide sono determinate dai nomi delle colonne della tabella associata, pertanto non è possibile avere attributi che non fanno parte delle colonne della tabella.

Quindi createcrea un'istanza del nuovo oggetto, lo convalida e quindi lo salva nel database. E newcrea solo l'oggetto locale ma non tenta di convalidarlo o salvarlo nel DB.


5
Questa domanda riguarda i metodi del controller, non i metodi del modello.
sevenseacat,

8
@Karpie - Grazie per il voto negativo. Hai un buon punto, ma considera che molte persone hanno trovato utile questa risposta, soprattutto perché né il titolo né i tag la chiamano come una domanda solo per il controller. Quindi penso che questa risposta offra un valore uguale.
Justin Ethier,

16

Nuovo crea un'istanza di una nuova istanza del modello, ma non viene salvata finché non viene chiamato il metodo di salvataggio.

Crea fa lo stesso di nuovo, ma lo salva anche nel database.

A volte vuoi fare cose prima di salvare qualcosa nel database, a volte vuoi solo crearlo e salvarlo immediatamente.


1
Questa domanda riguarda i metodi del controller, non i metodi del modello.
sevenseacat,

11

Le parti RESTful di Rails sono fatte per essere molto vicine a come funziona il protocollo HTTP. Nel protocollo HTTP, una richiesta GET non dovrebbe modificare alcun dato. Logicamente, se osservi il modo in cui funzionano tutte le azioni RESTful in Rails, si abbineranno alle azioni HTTP. Un POST serve per generare nuovi dati, quindi è logicamente creato. Si utilizza un GET per pubblicare la versione del modulo o, in altre parole, la nuova azione. Index e show sono anche GET, update è un PUT (o PATCH in Rails 4+) e distruggere è un DELETE in HTTP.

Inoltre, separa bene la logica nel controller e offre un modo semplice per gestire gli errori (eseguendo nuovamente il rendering della nuova azione con messaggi di errore).


"You use a GET to serve the form version of that or in other words, the new action"grazie per la risposta, ma personalmente trovo questa convenzione di denominazione davvero confusa
Daniel Lizik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.