2012-03-20 9 views
43

Sono nuovo per le rotaie e non capisco le differenze tra l'uso di metodi di + + salvataggio e il metodo di creazione.Differenze tra le rotaie tra nuove + salva e crea

def create 
    @item = Item.new(params[:item]) 

    respond_to do |format| 
     if @item.save 
     format.html { redirect_to @item, notice: 'Item was successfully created.' } 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
end 

e:

def create 

    respond_to do |format| 
     if Item.create(params[:item]) 
     format.html { redirect_to @item, notice: 'Item was successfully created.' } 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

risposta

38

Internamente create chiama new poi save comunque:

def create(attributes = nil, options = {}, &block) 
    if attributes.is_a?(Array) 
     attributes.collect { |attr| create(attr, options, &block) } 
    else 
     object = new(attributes, options, &block) 
     object.save 
     object 
    end 
    end 
3

quando si utilizza, le rotaie in realtà sta creando il record, ma non salvarlo, così nel processo è inoltre possibile assegnare dovrebbe occupare

@item = Item.new(params[:item]) 

ma quando si utilizza:

if Item.create(params[:item]) 
..... 

it wi ll creare immediatamente e salvare

si può controllare con rails c

+0

ok ma nel mio caso ci sono differenze tra l'utilizzo di nuovo + salvare o solo creare direttamente? –

+0

no, nessuna differenza, entrambi stanno facendo lo stesso lavoro –

12

new crea l'oggetto, ma non salvarlo.

create crea l'oggetto e lo salva, cioè .new e .save

create! crea l'oggetto e cerca di salvarla, ma solleva un'eccezione se convalide non riesce, per esempio .new e .save!

Uno degli elementi confusione è che quanto sopra è le azioni che si prendono su un oggetto, ma i nomi simili sono anche dato al controllore metodi, soprattutto in un ambiente rilassante. Ad esempio hai un'azione crea .... che crea un nuovo oggetto, quindi lo salva e un altro crea un'azione che crea semplicemente un oggetto.

Se ti stai chiedendo "perché creare un oggetto se non lo salverò?" considera questo: il sistema 'prova' a salvare l'oggetto, ma una convalida lo impedisce e all'utente viene chiesto di inserire ulteriori informazioni su un modulo, magari campi obbligatori. Si vuole che l'oggetto sia ancora creato (.new) mentre questo sta succedendo e manterrà i valori che sono stati assegnati finora. Tuttavia, in realtà non ottiene save d fino a quando non passa anche le convalide.

97

Se è vero che le chiamate createnew e poi save c'è una grande differenza tra le due alternative nei loro valori di ritorno.

Save restituisce true o false a seconda che l'oggetto sia stato salvato correttamente nel database o meno. Questo può quindi essere usato per il controllo del flusso come dal primo esempio nella domanda sopra.

Create restituirà il modello indipendentemente dal fatto che l'oggetto sia stato salvato o meno. Ciò ha implicazioni per il codice precedente in quanto il ramo in cima dell'istruzione if verrà sempre eseguito anche se l'oggetto non supera le convalide e non viene salvato.

Se si utilizza create con logica di diramazione, si corre il rischio di errori silenziosi che non è il caso se si utilizza new + save.

L'alternativa create può essere utile nei controller dove respond_with viene utilizzato per le risposte API (JSON/XML). In questo caso l'esistenza di errori sull'oggetto causerà la restituzione degli errori nella risposta con uno stato di unprocessable_entity, che è esattamente ciò che si desidera da un'API.

Utilizzerò sempre l'opzione new + save per html, soprattutto se si sta facendo affidamento sul valore restituito per il controllo di flusso.

+0

"Se si utilizza create con logica di branching si è a rischio di errori silenziosi che non è il caso se si utilizza il nuovo + save." Grazie per questo! – jacoulter

+0

Per la convalida dell'oggetto e la creazione di stenografia: '.create (...). Valido?' Restituirà true e creerà l'oggetto o restituirà false e non farà nulla. – neonmate

+0

Ho ragione nel dire che è meglio 'new' e' save' in modals? @nmott è questo che intendi per HTML? –