2009-09-23 8 views
0

J'utilise mechanize et j'ai un problème avec un formulaire ... le formulaire a deux boîtes de sélection avec le même nom.Mécaniser la définition d'un champ avec un nom en double

Comment puis-je sélectionner le second?

ie. NumNights deuxième occurrence.

je l'ai trouvé dans la documentation quelque chose comme ceci:

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

mais cela ne fonctionne pas:

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

Répondre

2

obtenir une référence à une forme, et itérer sur les membres. Quelque chose comme ceci:

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

Après avoir rempli les formulaires, soumettez-le. Je n'ai pas exécuté ce code, mais je pense que cela devrait fonctionner.

+0

qui fonctionne magnifiquement, merci! – holden

+0

vous êtes les bienvenus! – Geo

0

Geo a une solution décente, mais il y a quelques occasions manquées là-bas.

Si vous ne trouvez qu'un seul élément, il est probablement plus efficace d'utiliser Enumerable # find au lieu de Enumerable # select et ensuite Array # en premier. Alternativement, vous pouvez simplement faire la réaffectation pendant la sélection.

Si vous regardez l'approche proposée, il y a une chance que vous allez déclencher une exception si un champ avec ce nom ne se trouve pas:

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

je revendiquerais l'aide Enumerable # sélectionner et simplement faire le travail à l'intérieur de la boucle, beaucoup plus sûr de cette façon:

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'autre approche consiste à utiliser Enumerable # trouver qui retourne au plus un élément:

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

Bien sûr, vous pouvez toujours pepper votre code avec des captures d'exception, mais cela semble contre-productif.

Questions connexes