Domanda

Sto usando meccanizzare e hanno un problema su una forma ... la forma ha due caselle di selezione con lo stesso nome.

Come posso selezionare la seconda?

es. NumNights seconda occorrenza.

ho trovato nella documentazione qualcosa di simile:

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

, ma questo non ha funzionato:

form.field_with(:name => [ 'NumNights', 2 ]).options[no_days.to_i-1].select
È stato utile?

Soluzione

Ottenere un riferimento ad una forma, e scorrere i membri. Qualcosa di simile a questo:

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

Dopo aver finito la compilazione dei moduli, la sottopone. Io non ho fatto funzionare questo codice, ma penso che dovrebbe funzionare.

Altri suggerimenti

Geo ha una soluzione decente, ma c'è un paio di occasioni mancate lì.

Se si sta solo trovando un elemento, è probabilmente più efficiente usare Enumerable # trovare invece di Enumerable # selezionare e quindi Array # primo in cima a quello. In alternativa, si può semplicemente fare la riassegnazione durante la selezione.

Se si guarda l'approccio suggerito c'è una possibilità farai scattare un'eccezione se un campo con quel nome non si trova:

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

Mi piacerebbe sostengo utilizzando Enumerable # selezionare e semplicemente fare il lavoro all'interno del ciclo, molto più sicuro in questo modo:

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

L'altro approccio è quello di utilizzare Enumerable # trovare quale ritorna al più un elemento:

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

Naturalmente si può sempre il pepe il codice con le catture di eccezione, ma che sembra controproducente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top