Rieles nuevo vs crear


195

¿Por qué hay una necesidad de definir un nuevo método en el controlador RESTful, seguir con un método de creación?

La búsqueda de Google no me proporcionó la respuesta que estaba buscando. Entiendo la diferencia, pero necesito saber por qué se usan como están.

Respuestas:


263

Dentro de la implementación de REST de REST, new y create se tratan de manera diferente.

Un HTTP GET to /resources/newestá destinado a representar un formulario adecuado para crear un nuevo recurso, lo que hace llamando al nuevo acción dentro del controlador, que crea un nuevo registro no guardado y representa el formulario.

Un HTTP POST /resourcestoma el registro creado como parte de la nueva acción y lo pasa a la acción de creación dentro del controlador, que luego intenta guardarlo en la base de datos.


1
Leí exactamente esta información en un sitio de tutoriales sobre rieles. No fue hasta que realmente lo uso que se volvió relevante.
StorymasterQ

248

De la documentación de ActiveRecord :: Base :

crear (atributos = nulo) {| objeto | ...}

Crea un objeto (o varios objetos) y lo guarda en la base de datos, si pasan las validaciones. El objeto resultante se devuelve si el objeto se guardó correctamente en la base de datos o no.

nuevo (atributos = nulo) {| self si block_given? | ...}

Los nuevos objetos pueden instanciarse como vacíos (no pasar parámetros de construcción) o preestablecidos con atributos pero aún no guardados (pasar un hash con nombres de clave que coincidan con los nombres de columna de la tabla asociada). En ambos casos, las claves de atributo válidas están determinadas por los nombres de columna de la tabla asociada; por lo tanto, no puede tener atributos que no formen parte de las columnas de la tabla.

Por lo tanto, createcrea una instancia del nuevo objeto, lo valida y luego lo guarda en la base de datos. Y newsolo crea el objeto local pero no intenta validarlo ni guardarlo en la base de datos.


55
Esta pregunta es sobre los métodos del controlador, no los métodos del modelo.
sevenseacat

8
@Karpie - Gracias por el voto negativo. Usted hace un buen punto, pero considere que a muchas personas les pareció útil esta respuesta, especialmente porque ni el título ni las etiquetas la mencionan como una pregunta exclusiva del controlador. Así que creo que esta respuesta proporciona valor igual.
Justin Ethier

16

New crea una instancia nueva de Model, pero no se guarda hasta que se llama al método save.

Crear hace lo mismo que nuevo, pero también lo guarda en la base de datos.

A veces quieres hacer cosas antes de guardar algo en la base de datos, a veces solo quieres crear y guardarlo de inmediato.


1
Esta pregunta es sobre los métodos del controlador, no los métodos del modelo.
sevenseacat

11

Las partes RESTful de Rails están hechas para estar muy cerca de cómo funciona el protocolo HTTP. En el protocolo HTTP, una solicitud GET no debe modificar ningún dato. Lógicamente, si observa la forma en que funcionan todas las acciones RESTful en Rails, coincidirán con las acciones HTTP. Un POST es para generar nuevos datos, por lo que se crea lógicamente. Utiliza un GET para servir la versión del formulario o, en otras palabras, la nueva acción. Index y show también son GET, la actualización es un PUT (o PATCH en Rails 4+), y destroy es un DELETE en HTTP.

Además, separa muy bien la lógica en el controlador y le brinda una manera fluida de lidiar con los errores (al volver a representar la nueva acción con mensajes de error).


"You use a GET to serve the form version of that or in other words, the new action"gracias por la respuesta, pero personalmente encuentro esta convención de nombres realmente confusa
Daniel Lizik
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.