Saltar al contenido

Los atributos anidados de Ruby on Rails

De nuevo, como antes, las adiciones al ProductsController están sólo en el método de los parámetos de productos, que ahora debería incluir también los atributos_variantes.

1234567defproduct_params params.require(:product).permit(:name,:price, image_attributes:[:id,:url,:alt,:caption], variant_attributes:[:id,:name,:price,:_destroy])end

rubí

Los atributos anidados de Ruby on Rails
Los atributos anidados de Ruby on Rails

El modelo de producto sólo tiene la siguiente adición para permitir la asociación de atributos anidados para las variantes:

1acepta los atributos anidados para las variantes, rechaza si::todo en blanco, permite destruir:true

rubí

Fíjate en la opción reject_if :all_blank. Significa que cualquier registro en el que los atributos estén todos en blanco (excluyendo el valor de _destroy) será rechazado. reject_if también soporta pasarle un Proc, que puede ser usado para alguna validación adicional, y también comprueba si se rechaza/incluye la asociación.

Hay otras dos opciones útiles. La primera es la opción del límite, que especifica el número máximo de registros que se procesarán. La segunda opción es update_only que se aplica a las asociaciones uno a uno y tiene un comportamiento bastante interesante. Si se establece en true, sólo actualizará los atributos del registro asociado. Si se establece a false al cambiar, no tocará el registro antiguo pero creará uno nuevo con los nuevos atributos. Por defecto es false y creará un nuevo registro a menos que el registro incluya un atributo id, que es exactamente la razón por la que incluimos el atributo id en los parámetos_de_producto para la asociación de imágenes uno a uno. Una solución alternativa habría sido definir los atributos anidados de esta manera:

1acepta los atributos anidados para :image, update_only:true

rubí

Puedes leer más sobre los Atributos Anidados en la documentación de Ruby on Rails donde se demuestra y documenta cada una de las opciones de configuración.