Pregunta

Estoy usando mecanizar y tiene un problema en una forma ... la forma tiene dos cajas de selección con el mismo nombre.

¿Cómo puedo seleccionar el segundo?

ie. NumNights segunda ocurrencia.

he encontrado en el docs algo como esto:

form.set_fields( :foo => ['bar', 1] )

pero esto no funcionó:

form.field_with(:name => [ 'NumNights', 2 ]).options[no_days.to_i-1].select
¿Fue útil?

Solución

Obtener una referencia a un formulario, y iterar sobre los miembros. Algo como esto:

my_fields = form.fields.select {|f| f.name == "whatever"}
my_fields[1].whatever = "value"

Después de terminar de llenar los formularios, someterlo. No he corrió este código, pero creo que debería funcionar.

Otros consejos

Geo tiene una solución decente, pero hay un par de oportunidades perdidas allí.

Si se encuentra en la búsqueda de un elemento, es probable que sea más eficaz utilizar Enumerable # en lugar de encontrar Enumerable # y luego seleccione Matriz # primero por encima de eso. Alternativamente, puede simplemente hacer la reasignación durante la selección.

Si nos fijamos en el enfoque sugerido que hay una posibilidad de que usted desencadenar una excepción si no se encuentra un campo con ese nombre:

# Original approach
my_fields = form.fields.select {|f| f.name == "whatever"}
# Chance of exception here, calling nil#whatever=
my_fields[1].whatever = "value"

Me aboga por el empleo Enumerable # seleccionar y simplemente hacer el trabajo dentro del bucle, mucho más seguro de esa manera:

my_fields = form.fields.select do |f|
  if (f.name == "whatever")
    # Will only ever trigger if an element is found,
    # also works if more than one field has same name.
    f.whatever = 'value'
  end
end

El otro enfoque es utilizar Enumerable # encontrar que vuelve a lo más un elemento:

# Finds only a single element
whatever_field = form.fields.find { |f| f.name == "whatever" }
whatever_field and whatever_field.whatever = 'value'

Por supuesto, siempre se puede pimienta el código con las capturas de excepción, pero que parece contraproducente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top