Механизировать установку поля с повторяющимся именем

StackOverflow https://stackoverflow.com/questions/1465723

Вопрос

Я использую mechanize, и у меня возникла проблема с одной формой...форма содержит два поля выбора с одинаковым названием.

Как я могу выбрать второй вариант?

т. е.NumNights второе происшествие.

я нашел в документах что-то вроде этого:

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

но это не сработало:

form.field_with(:name => [ 'NumNights', 2 ]).options[no_days.to_i-1].select
Это было полезно?

Решение

Получите ссылку на форму и выполните итерацию по элементам.Что- то вроде этого :

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

После того как вы закончите заполнять формы, отправьте их.Я не запускал этот код, но я думаю, что он должен сработать.

Другие советы

У Geo есть достойное решение, но в нем есть несколько упущенных возможностей.

Если вы находите только один элемент, вероятно, эффективнее использовать Enumerable#find вместо Enumerable#select, а затем Array#first поверх этого.В качестве альтернативы вы можете просто выполнить переназначение во время выбора.

Если вы посмотрите на предлагаемый подход, есть вероятность, что вы вызовете исключение, если поле с таким именем не найдено:

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

Я бы посоветовал использовать Enumerable#select и просто выполнять работу внутри цикла, так гораздо безопаснее:

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

Другой подход заключается в использовании Enumerable#find, который возвращает не более одного элемента:

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

Конечно, вы всегда можете дополнить свой код перехватами исключений, но это кажется контрпродуктивным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top