Rotaie nuove vs crea

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

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

Nell’ambito dell’implementazione di REST di REST new e create sono trattate in modo diverso.

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

Un POST /resources HTTP prende 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.

Dalla documentazione di ActiveRecord :: Base :

create (attributes = nil) {| object | …}

Crea un object (o più oggetti) e lo salva nel database, se le convalide passano. L’object risultante viene restituito se l’object è stato salvato correttamente nel database o meno.

nuovo (attributi = nil) {| self se block_given? | …}

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

create quindi un’istanza del nuovo object, lo convalida e quindi lo salva nel database. E new crea solo l’object locale ma non tenta di convalidarlo o salvarlo nel DB.

New istanzia una nuova istanza Model, 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 creare e salvarlo subito.

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 si guarda al modo in cui funzionano tutte le azioni RESTful in Rails, esse corrisponderanno alle azioni HTTP. Un POST è per generare nuovi dati, quindi è logicamente creato. Si utilizza un GET per servire la versione del modulo o, in altre parole, la nuova azione. L’indice e lo spettacolo sono anche GET, l’aggiornamento è un PUT (o PATCH in Rails 4+), e destroy è un DELETE in HTTP.

Inoltre, separa piacevolmente la logica nel controller e offre un modo semplice per gestire gli errori (re-rendering della nuova azione con messaggi di errore).