etiquetas - ¿Qué reglas sigue HTML al construir parámetros?
meta tags seo (3)
La única forma que conozco de que pueda obtener ambos parámetros de una forma pero que estén anidados de manera diferente es que si proporciona algún id al nuevo campo de entrada. Eso es lo que distingue a los elementos de la matriz type_logistics_attributes
.
Tenía una necesidad similar y usé la forma anidada de ryanb . Cuando lo uso para el mismo propósito que el tuyo, lo que hace es que proporciona una identificación aleatoria al nuevo campo de entrada. Así es como se diferencia.
Espero que esto te guíe en la dirección correcta.
Estoy usando Rails para crear automáticamente objetos secundarios en función de un conjunto complejo de atributos anidados. Por lo tanto, necesito que los parámetros estén anidados de una manera muy particular. Obviamente, me doy cuenta de que puedo construirlos como quiera con JS, pero me gustaría que el orden del formulario ayude automáticamente con la construcción. Para el contexto, tengo 2 columnas, representadas por 2 <td>
s. Cada columna puede crear un nuevo registro o editar un registro existente. Por supuesto, cuando se va a modificar un registro existente, se debe pasar el ID del registro.
El HTML renderizado es el siguiente:
<td width="50%" style="padding-right:3%" class="logistic-details" data-type="logistics" data-typelogistics="delivery" data-instructions="test instructions" data-id="1" data-amount="20">
<span class="area-to-inject-amount-inputs" data-object="type_logistics" data-type="logistics" data-typelogistics="delivery">
<input class="labeler-response" name="type_logistics_attributes[][id]" type="hidden" value="1">
<input class="labeler-response" name="type_logistics_attributes[][instructions]" type="text" value="test instructions">
</span>
</td>
<td width="50%" style="padding-right:3%" class="logistic-details" data-type="logistics" data-typelogistics="pickup" data-instructions="" data-id="" data-amount="0">
<span class="area-to-inject-amount-inputs" data-object="type_logistics" data-type="logistics" data-typelogistics="pickup" data-actioned="charged">
<input type="hidden" name="type_logistics_attributes[][type_of_logistics]" value="pickup">
<input class="injected-amount-input" type="number" min="0" max="" placeholder="Amount" name="type_logistics_attributes[][charged_amounts_attributes][][amount]" value="20">
<span class="area-to-inject-type-of-amount">
<input type="hidden" name="type_logistics_attributes[][charged_amounts_attributes][][type_of_amount]" value="logistics">
</span>
<input class="labeler-response" name="type_logistics_attributes[][instructions]" type="text" placeholder="Enter address and instructions">
</span>
</td>
En este caso, el primer <td>
está modificando un registro existente con un ID de 1, mientras que el segundo <td>
proporciona los parámetros para crear un nuevo registro. Cuando se crea un nuevo registro, también se creará el niño charged_amounts
. Por lo tanto, estos son los parámetros que yo esperaría:
"type_logistics_attributes"=>[
{"id"=>"1", "instructions"=>"test instructions"},
{"type_of_logistics"=>"pickup", "charged_amounts_attributes"=>[{"amount"=>"40", "type_of_amount"=>"logistics"}], "instructions" => "123 Fake street"}
]
En cambio, estoy obteniendo lo siguiente:
"type_logistics_attributes"=>[
{"id"=>"1", "type_of_logistics"=>"pickup", "instructions"=>"test instructions", "charged_amounts_attributes"=>[{"amount"=>"40", "type_of_amount"=>"logistics"}]},
{"instructions"=>"123 Fake street"}
]
De alguna manera, el límite <td>
no está funcionando y los atributos charged_amount
alguna manera se han agrupado en la primera modificación de registro existente <td>
.
¡Gracias!
No es <td>
ni ningún elemento HTML similar que haga un "límite" para las entradas, es solo el elemento <form>
. Todas las entradas que están dentro de una etiqueta <form>
son enviadas por el navegador como parámetros al enviar el formulario. Probablemente tenga ambas columnas en una <form>
y es por eso que los parámetros de ambas columnas se entremezclan en los params
.
No estoy seguro de que haya una manera de hacerlo específicamente como lo desea, pero puede hacer que los params se vean así:
"type_logistics_attributes"=>[
{"id"=>"1", "instructions"=>"test instructions"},
{"id"=>"1", "type_of_logistics"=>"pickup", "charged_amounts_attributes"=>[{"amount"=>"40", "type_of_amount"=>"logistics"}], "instructions" => "123 Fake street"}
]
Puede lograrlo agregando una entrada oculta adicional que repita la ID aquí:
<td width="50%" style="padding-right:3%" class="logistic-details" data-type="logistics" data-typelogistics="pickup" data-instructions="" data-id="" data-amount="0">
<span class="area-to-inject-amount-inputs" data-object="type_logistics" data-type="logistics" data-typelogistics="pickup" data-actioned="charged">
<input name="type_logistics_attributes[][id]" type="hidden" value="1">
<input type="hidden" name="type_logistics_attributes[][type_of_logistics]" value="pickup">
<input class="injected-amount-input" type="number" min="0" max="" placeholder="Amount" name="type_logistics_attributes[][charged_amounts_attributes][][amount]" value="20">
<span class="area-to-inject-type-of-amount">
<input type="hidden" name="type_logistics_attributes[][charged_amounts_attributes][][type_of_amount]" value="logistics">
</span>
<input class="labeler-response" name="type_logistics_attributes[][instructions]" type="text" placeholder="Enter address and instructions">
</span>
</td>
Rails tiene una regla para manejar esto: toma los atributos de izquierda a derecha en la cadena de consulta (o de arriba a abajo en su HTML), y crea un nuevo objeto cada vez que ve un atributo repetido.