La solución correcta dependerá de si planea almacenar valores escalares en $_POST['factura']['nuevos_elementos_atributos'] o si planea convertirlo en una matriz de matrices (en otras palabras, planea tener múltiplos de los nuevos_elementos_atributos .
Si solo planea almacenar valores escalares, primero deberá cambiar cada uno de los elementos del formulario para que se vea así:
name="inovoice[new_item_attributes][description]"
Notarás que el [] vacío se ha ido.
Y luego su ciclo debería verse así:
foreach($_POST['invoice']['new_item_attributes'] as $key => $val) {
$data = array('description => $value);
}
De lo contrario, deberá usar esto en su código PHP:
foreach($_POST['invoice']['new_item_attributes'] as $key => $val) {
$data = array('description' => $val['description']);
}
O:
foreach($_POST['invoice']['new_item_attributes'] as $key => $val) {
foreach($val as $sub => $value) {
$data = array($sub => $value);
}
}