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.
qui fonctionne magnifiquement, merci! – holden
vous êtes les bienvenus! – Geo