机械化设置具有重复名称的字段

时间:2009-09-23 12:39:48

标签: ruby-on-rails ruby forms duplicates mechanize

我正在使用机械化并在一个表单上出现问题...表单有两个具有相同名称的选择框。

如何选择第二个?

即。 NumNights第二次出现。

我在文档中发现了类似这样的内容:

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

但这不起作用:

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

2 个答案:

答案 0 :(得分:2)

获取对表单的引用,并迭代成员。像这样:

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

填写表格后,请提交。我没有运行此代码,但我认为它应该可以运行。

答案 1 :(得分:0)

Geo有一个不错的解决方案,但那里有一些错失的机会。

如果你只找到一个元素,那么使用Enumerable #jind而不是Enumerable #select然后再使用Array#可能更有效率。或者,您可以在选择期间进行重新分配。

如果您查看建议的方法,如果找不到具有该名称的字段,您可能会触发异常:

# 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'

当然,您可以随时捕获异常捕获代码,但这似乎适得其反。