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?

Author: Tim Knight, 2008-12-31

4 answers

Hay un par de diferencias, pero no son grandes:

  1. {[0] } es equivalente a .new seguido de .save. Es más sucinto.
  2. .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
  3. Creo que .buildes 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.

 221
Author: zenazn,
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.

 32
Author: nmott,
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.

 6
Author: rkj,
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

 5
Author: Vineeth,
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