2012-03-20 9 views
43

Soy nuevo en los rieles y no entiendo las diferencias entre el uso de los nuevos métodos + guardar y el método de creación.Diferencias en los raíles entre nuevo + guardar y crear

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 

y:

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 

Respuesta

38

Internamente create llama new continuación save todos modos:

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

cuando se utiliza, rieles en realidad es la creación de los registros, pero no lo guardó, por lo que en el proceso también puede asignar Smth

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

pero cuando usa:

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

it wi ll crear y guardar inmediatamente

se puede comprobar con rails c

+0

bien, pero en mi caso existen diferencias entre usar nuevo + guardar o solo crear directamente? –

+0

no, no hay diferencia, ambos están haciendo el mismo trabajo –

12

new crea el objeto, pero no guardarlo.

create crea el objeto y la guarda, es decir .new y .save

create! crea el objeto y trata de salvarla, pero plantea una excepción si falla validaciones, por ejemplo, .new y .save!

Uno de los elementos de confusión es que lo anterior es las acciones que realiza sobre un objeto, pero también se dan nombres similares a los métodos del controlador, especialmente en un entorno RESTful. Por ejemplo, tiene una acción de creación ... que crea un nuevo objeto y luego lo guarda y otra acción de creación que crea un objeto.

Si se está preguntando "¿por qué crear un objeto si no voy a guardarlo?" considere esto: el sistema 'intenta' salvar el objeto, pero una validación lo impide y se le pide al usuario que complete más información en un formulario, tal vez campos obligatorios. Uno quiere que el objeto aún se cree (.new) mientras esto sucede y mantendrá los valores que se han asignado hasta el momento. Sin embargo, en realidad no obtiene save d hasta que pase las validaciones también.

97

Aunque es cierto que create llamadas new y luego save hay una gran diferencia entre las dos alternativas en sus valores de retorno.

Save devuelve true o false dependiendo de si el objeto se guardó correctamente en la base de datos o no. Esto se puede usar para controlar el flujo según el primer ejemplo en la pregunta anterior.

Create devolverá el modelo independientemente de si el objeto se guardó o no. Esto tiene implicaciones para el código anterior en que la rama superior de la declaración if siempre se ejecutará incluso si el objeto no supera las validaciones y no se guarda.

Si usa create con lógica de bifurcación corre el riesgo de fallas silenciosas, que no es el caso si usa new + save.

La alternativa create puede ser útil en controladores donde respond_with se utiliza para respuestas de API (JSON/XML). En este caso, la existencia de errores en el objeto hará que los errores se devuelvan en la respuesta con un estado de unprocessable_entity, que es exactamente lo que quiere de una API.

Siempre usaré la opción new + save para html, especialmente si confía en el valor de retorno para el control de flujo.

+0

"Si usa crear con lógica de bifurcación, corre el riesgo de fallas silenciosas, que no es el caso si usa new + save". ¡Gracias por esto! – jacoulter

+0

Para la validación de objetos y el uso abreviado de crear: '.create (...). Valid?' Devolverá true y creará el objeto o devolverá false y no hará nada. – neonmate

+0

¿Tengo razón al decir que es mejor 'nuevo' y 'guardar' en modales? @nmott es eso a lo que te refieres con HTML? –