Así que he estado viendo a la gente que usa .build
, .create
y.create!
dentro de sus controladores más y más últimamente. ¿Cuál es la diferencia de usar .new
y pasar el objeto param'd y luego .save
? ¿Hay pros y contras? ¿El uso de estos otros métodos ofrece beneficios?
ruby-on-rails
Tim Knight
fuente
fuente
Aunque es correcto que
create
llamanew
y luegosave
hay una gran diferencia entre las dos alternativas en sus valores de retorno.Save
devuelvetrue
ofalse
dependiendo de si el objeto se guardó correctamente en la base de datos o no. Esto se puede usar para el control de 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 laif
instrucción siempre se ejecutará, incluso si el objeto falla las validaciones y no se guarda.Si usa la
create
lógica de ramificación, corre el riesgo de fallas silenciosas, lo que no es el caso si usanew
+save
.create!
no sufre el mismo problema que plantea y una excepción si el registro no es válido.La
create
alternativa puede ser útil en controladores donderespond_with
se usa para respuestas 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 deunprocessable_entity
, que es exactamente lo que desea de una API.Siempre usaría la opción
new
+save
para html, especialmente si confía en el valor de retorno para el control de flujo.fuente
#create es una versión más corta de new y save. #¡crear! está lanzando una excepción si la validación no fue positiva.
fuente
En segundo lugar, las respuestas anteriores. Además
create
, no se puede pasarfalse
como argumento con el que se puede hacersave
. Pasarfalse
como argumento omitirá todas las validaciones de rielesfuente