質問: ``` |AAA|セレクトボックス1▽|●| |BBB|セレクトボックス2▽|○| ``` 上記のような画面でラジオボタンでAAAの方を選択しているのにセレクトボックス2を操作してしまうとセレクトボックス2の値がPOSTでサーバ側に渡されてしまいます。 セレクトボックス1の値を渡すためにはどうすればよろしいでしょうか? ``` <% bb.aas.each do |aa| %> <%= display_state_icon aa.state %> <%= aa.name %> <%= aa.displayname %> <% if aa.list_nic(bb.id).secip.nil? %> <%= select_tag :ip, options_for_select([[aa.list_nic(bb.id).pr_ip_name,""]] ), :class => "span12 nat_ip" %> <% else %> <%= select_tag :ip, options_for_select(aa.list_nic(bb.id).secip.map{|ip|[aa.list_nic(bb.id).sec_ip_name(ip["address"]),ip["address"]]} ), :prompt => aa.list_nic(bb.id).pr_ip_name,:class => "span12 nat_ip" %> <% end %> <% if :radio_button %><%= radio_or_check_tag(:radio_button, aa.id, Vm) %><% end %> <% end %> ```
回答: おそらく求めている挙動は AAAのラジオボタンを選択している場合はセレクトボックス1の値を受け取り、 BBBのラジオボタンを選択している場合はセレクトボックス2の値を受け取りたい ということだと思いますが、理解は合ってるでしょうか? 残念ながらRailsやHTMLフォームにはそのような機能は標準で付いていません。 なので、自分でロジックを組む必要があります。 最低限変更しなければいけないのは `select_tag :id` の部分です。 ここはどちらも同じフィールドとして扱われるため、セレクトボックス1の選択値がセレクトボックス2で常に上書きされるようになっていると思います。 解決策はいろいろありますが、 `select_tag 'ids'` のようにするとコントローラ側で次のようなコードが書けるはずです。 ``` # セレクトボックス1の値を取得 id_selectbox_1 = params[:ids][0] # セレクトボックス2の値を取得 id_selectbox_2 = params[:ids][1] ``` あとはコントローラ側でラジオボタンの選択値に応じて処理を切り変える感じでしょうか。 ``` # ラジオボタンの選択値に応じてインデックスを切り替える index = (ラジオボタン1が選択されている場合) ? 0 : 1 # 目的のセレクトボックスの値を取得 id_selectbox = params[:ids][index] ``` もしくはJavaScriptを使ってラジオボタンの選択値に応じてサーバーに送信する値を切り替える、というアプローチもあると思います。 ただし、JSが無効になっていたりすると意図した通りにデータが送信されません。ロジックも少し複雑になると思います。 なので、コントローラ側で処理する方がベターかなと思います。 ### EDIT > > 行が増える分挙動を制御する必要がある感じでしょうか? > > > 最初の例ではセレクトボックス1, 2しかないが、実際には1個だったり5個だったり数が変わるのでどうしたらよいか、という質問で合ってますか? であれば、 ``` index = (ラジオボタン1が選択されている場合) ? 0 : 1 ``` の部分を ``` index = (何らかの方法でラジオボタンで選択されたindexを特定する) ``` ということになると思います。 もしくはviewの方を次のように変更しても良いかもしれません。 ``` <%= select_tag "select_#{aa.id}", options_for_select([aa.ip]//hash値※ここが取れない) %> ``` この場合、コントローラ側は次のようなコードになります。 ``` id = (選択されたラジオボタンのaa.idを取得) id_selectbox = params["select_#{id}"] ``` ただ、何にせよ情報が少ないので適切な回答がしづらいです。 まだ問題が解決しない場合は以下のような情報を追記してください。 * モデルの定義(aaとはどういうクラスか?どんな属性を持っているのか等) * フォームの全体像(`form_for`や`form_tag`もコードに含める) * 具体的なユースケース(「注文フォームで発送方法をラジオボタンで選択し、配達日時をセレクトボックスから選ぶ」等) 一般的に、変に内容をぼかさず、極力実際の実装に近い形(できればそのままのコード)を載せてもらった方が回答する側も回答しやすくなります。