0

mechanizeを使用していますが、1つのフォームで問題が発生しています...フォームには同じ名前の2つの選択ボックスがあります。

2番目のものを選択するにはどうすればよいですか?

すなわち。NumNightsの2回目の発生。

私はドキュメントで次のようなものを見つけました:

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

しかし、これは機能しませんでした:

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

2 に答える 2

2

フォームへの参照を取得し、メンバーを繰り返し処理します。このようなもの :

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

フォームへの入力が完了したら、送信します。このコードは実行していませんが、機能するはずです。

于 2009-09-23T12:49:46.517 に答える
0

Geoにはまともな解決策がありますが、そこにはいくつかの機会を逃しています。

要素を1つだけ検索する場合は、Enumerable#selectの代わりにEnumerable#findを使用してから、その上に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

もう1つのアプローチは、最大で1つの要素を返すEnumerable#findを使用することです。

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

もちろん、例外キャッチを使用してコードをいつでもペッパーすることができますが、それは逆効果のようです。

于 2009-09-23T14:29:15.633 に答える