He estado luchando para crear un formulario para un modelo Mongoid que tiene un campo de matriz. Quiero que mi formulario tenga en el cuadro de texto por entrada en la matriz. Si estoy creando un nuevo registro, el valor predeterminado será un campo vacío (y algunos javascript para agregar nuevos campos dinámicamente en la página).Formularios para crear y actualizar campos mongoid array
He buscado una solución usando fields_for, pero parece que está más destinado a manejar el caso donde tienes una matriz de objetos/modelos y no el caso que tengo, que es una matriz de cadenas.
Voy a usar el ejemplo de una persona y un número de teléfono.
class Person
include Mongoid::Document
field :name, :type => String
field :phone_numbers, :type => Array
end
Para el controlador, a suponer el controlador típico, pero en el método new
I inicializa la matriz phone_number con una cadena en blanco.
Aquí está el código del formulario:
<%= form_for(@person) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :phone_numbers %><br />
<% @person.phone_numbers.each do |phone_number| %>
<%= text_field_tag "person[phone_numbers][]", phone_number %>
<% end %>
</div>
<% end %>
Todo esto funciona bien. Hay algunas cosas que no me gustan.
- El nombre codificado del campo en la llamada text_field_tag.
- Usando text_field_tag en lugar de f.text_field
- Tener la sensación de que de alguna manera debería usar fields_for en lugar de esta
¿Alguien tiene alguna sugerencia mejor sobre cómo implementar esto? ¿O lo considerarías correcto?
En el primer ejemplo es: 'f.text_field: numeros_telefono,: nombre => "# {} f.object_name [numeros_telefono] []"' ¿Se puede cambiar este typo – shingara
Esta solución está bien, pero también hay que establecer el valor de cada número de teléfono: En su código, cada una 'numeros_telefono [] campo' '@ tiene el person.phone_numbers' arsenal completo como valor. Tienes que cambiar a esto: 'f.text_field: phone_numbers,: name =>" # {f.object_name} [phone_numbers] [] ",: value => phone_number'. En mi caso, ahora tengo que agregar nuevos campos con cocoon, que seguramente será otro problema ya que está basado en asociaciones ... –