机械化设置字段具有重复名称
-
13-09-2019 - |
题
我使用机械化和一个表单上有一个问题...形式有两个名称相同的选择框。
如何选择第二个?
即。 NumNights第二次出现。
i。在文档是这样的发现:
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"
大功告成在填写表格后,提交。我还没有遇到这样的代码,但我认为它应该工作。
其他提示
地理有一个体面的解决办法,但有一些错过的机会在那里。
如果你只找到一个元素,它可能更有效地首先使用可枚举#发现的,而不是可枚举#选择,然后阵列#最重要的是。或者,你可以简单地在选择做重新分配。
如果你看一下建议的方法有一个机会,你会触发一个异常,如果没有找到具有该名称的字段:
# Original approach
my_fields = form.fields.select {|f| f.name == "whatever"}
# Chance of exception here, calling nil#whatever=
my_fields[1].whatever = "value"
我提倡使用可枚举#选择并简单地做循环内的工作,更安全这种方式:
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
另一种方法是使用可枚举#找到其中至多有一个元件返回:
# Finds only a single element
whatever_field = form.fields.find { |f| f.name == "whatever" }
whatever_field and whatever_field.whatever = 'value'
当然,你可以随时辣椒你的代码异常捕获,但似乎适得其反。
不隶属于 StackOverflow