これを行う方法を考え出すという問題が1つあります。隣り合わせに表示する必要がある 2 つのフォームがありますが、フォームを埋め込むことはできません。最初のフォームの後に 2 番目のフォームを配置するだけで、これを回避できました。
ただし、レールは<% end %>
2番目のフォームのタグを無視しており、閉じる必要がある前に2番目のフォームを自動的に閉じています。これにより、フォームが機能しなくなります。
簡潔にするためにいくつかのビットを省略したビューを次に示します。
<div class="row">
<div class="col-md-3">
<div class="well">
<%= render "shared/some_form", url_path: foo_path %>
<%= form_tag some_other_path, method: :delete, id: "form_bulk_action", role: "form" do %>
<div id="bulk_action_group">
<div class="form-group">
<%= label_tag "perform_bulk_action", "For each checked item" %>
<%= select_tag "perform_bulk_action", options_for_select([ ["Delete", "destroy"] ]), class: "form-control" %>
</div>
<%= button_tag id: "foo" %>
</div>
</div>
</div>
<div class="col-md-9">
<table class="table table-condensed table-hover">
<thead>
<tr>
<th><%= check_box_tag :check_all_data_rows, "", false %></th>
</tr>
</thead>
<tbody>
<% @foo.each do |foo| %>
<tr>
<td><%= check_box_tag "bulk_ids[]", foo.id, false, %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<% end %>
some_form をロードしているパーシャルは最初のフォームです。そのフォームの開始と終了はパーシャル内で発生します。
2 番目の形式は form_tag です。html マークアップからわかるように、左側にサイドバーがあり、右側にメイン コンテンツがテーブルに読み込まれています。
2 番目のフォームの考え方は、行をチェックしてから、チェックされたアイテムに対して一括アクションを実行できるようにすることです。gmail で 15 通の電子メールにマークを付けてから削除する方法と似ています。
<% end %>
問題は、Rails がそのコード スニペットの下部にある を無視し、代わりに</form>
ボタンの直後にid: foo
.
その時点でフォームはすでに閉じられており、フォームの一部ではないため、これにより、bulk_ids 値が常に nil になります。クレイジーなことは、別のページ (つまり、ターボリンク) からページに移動したときにのみ失敗することです。</form>
ページを完全にロードすると機能しますが、主な問題はタグの早期終了だと思います。
フォームが埋め込まれず、フォームヘルパーを使用している間に2番目のフォームがテーブルの一番下で完全に閉じるように、これをすべて設定するにはどうすればよいですか?