複数レコードを一括削除する。
現状、削除は1件ずつしか実行できない。これでは10件まとめて削除したい時も、ちまちまと削除リンクをクリックして、その都度、削除確認のダイアログに対してOKをクリックしてと、操作が面倒だ。もっと快適に削除できた方が良い。お手本にしたのはGmailや、はてなフォトライフの編集ページだ。チェックありの項目に対して一括で削除できる。目指したいのはこんな感じの画面だ。
チェックボックスの列を追加する。
- チェックボックスを表示するために、列タイトルと列データに1列追加した。
<%#------ app/views/models/softwares/_listh.rhtml ------%> <%# 全部で90%で10%足りないが、10%の余りは、詳細 編集 削除リンクの列幅になる。 %> <% cell_width = {"check" =>4, "title" =>16, "description"=>30, "created_on" =>12, "updated_on" =>12, "keyword_id" =>16} %> <!--[:]--> <tr> <th width=<%= cell_width["check"].to_s %>% ></th><%# <------タイトルを1列追加 %> <% for column in Software.columns %> <% unless @controller.class.hidden_field?(@action_name, column.name) %> <th class=<%= selected(column.name) %> width=<%= cell_width[column.name].to_s %>% > ...(以下省略)...
<%#------ app/views/models/softwares/_listd.rhtml ------%> <!--[:]--> <tr class=<%= stripe %>> <td align=center><%= check_box_tag "checked_items[#{listd.id}]", listd.id %></td><%# <------チェックボックスを1列追加 %> <%- unless @controller.class.hidden_field?(@action_name, 'title') -%> <td class=<%= selected('title') %>> <%= link_to h(human_attribute_value(listd, 'title')), URI.encode(listd.url), :popup => true %></td> %> <%- end -%> ...(以下省略)...
フォームを追加して削除ボタンを作る。
- チェックボックスのデータを送信するために、formタグで囲って、submitボタンを作成した。
<%#------ app/views/softwares/list.rhtml ------%> ...(途中省略)... <%= render :partial => 'models/softwares/list_form' %> <%= start_form_tag :action => 'plural_destroy' %><%# <------フォームの始まりを追加 %> <table class="confirm" width=100%> <%= render :partial => 'models/softwares/listh' %> <% if !@softwares.empty? %> <%= render :partial => 'models/softwares/listd', :collection => @softwares %> <% else %> <tr><td colspan="6">レコードはありません。</td></tr> <% end %> <%= render :partial => 'models/softwares/list_page' %> </table> <%= submit_tag "チェックした項目を削除する" %><%# <------一括削除ボタンを追加 %> <%= end_form_tag %><%# <------フォームの終わりを追加 %> ...(以下省略)...
コントローラーでパラメーターを受け取り削除処理
- 送信されたデータをparams[:checked_items]で受け取る。
- itemsには削除対象のidの配列が代入される。
- destroyメソッドにidを配列で渡すと、一括削除が実現できる。
#------ app/controllers/softwares_controller.rb ------ ...(途中省略)... def plural_destroy items = params[:checked_items].keys Software.destroy(items) redirect_to :action => 'list' end ...(途中省略)...
以上が、必要最小限の一括削除のコード。しかし、この状態ではまだまだ問題が多い。間違って削除操作してしまう可能性もあるし、確実に削除されたのかどうかも不安になる。これをベースに操作性を改良していく予定だ。