Las diferencias entre.construir,.crear, y.crear! ¿y cuándo deben usarse?
Así que he estado viendo gente usando .construir, .crear, y .crear! dentro de sus controladores más y más últimamente. ¿Cuál es la diferencia de solo usar .nuevo y passig el objeto param'd y luego .¿salvar? ¿Hay pros y contras? ¿El uso de estos otros métodos ofrece beneficios?
4 answers
Hay un par de diferencias, pero no son grandes:
-
{[0] } es equivalente a
.new
seguido de.save
. Es más sucinto. -
.create!
es equivalente a.new
seguido de.save!
(arroja un error si se produce un error al guardar). También es un poco más corto - Creo que
.build
es en su mayoría un alias para.new
. funciona de una manera en Rails 3 y de otra manera en Rails
La parte más importante, sin embargo, es que estos métodos puede ser llamado a través de una asociación (has_many
, etc.) para vincular automáticamente los dos modelos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:16
Aunque es correcto que create
llama a 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 el control de flujo según el primer ejemplo de la pregunta anterior.
Create
devolverá el modelo independientemente de si el objeto se guardó o no. This has implications for the code above in que la rama superior de la instrucción if
siempre se ejecutará incluso si el objeto falla en las validaciones y no se guarda.
Si utiliza create
con lógica de ramificación, corre el riesgo de sufrir fallos silenciosos, lo que no es el caso si utiliza new
+ save
.
create!
no sufre del mismo problema que plantea y la excepción si el registro no es válido.
La alternativa create
puede ser útil en controladores donde respond_with
se usa para respuestas API (JSON/XML). En este caso la 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 desea de una API.
Siempre usaría el new
+ save
opción para html, especialmente si confía en el valor devuelto para el control de flujo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-08 08:53:14
#crear es la versión más corta de nuevo y guardar. #crear! está lanzando una excepción si la validación no fue positiva.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-31 18:25:09
Secundaría las respuestas anteriores. Más para create
, no se puede pasar false
como un argumento que se puede hacer con save
. Pasar false
como argumento saltará todas las validaciones de rails
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-05 05:19:37