複数レコードを一括削除する。

現状、削除は1件ずつしか実行できない。これでは10件まとめて削除したい時も、ちまちまと削除リンクをクリックして、その都度、削除確認のダイアログに対してOKをクリックしてと、操作が面倒だ。もっと快適に削除できた方が良い。お手本にしたのはGmailや、はてなフォトライフの編集ページだ。チェックありの項目に対して一括で削除できる。目指したいのはこんな感じの画面だ。

チェックボックスの列を追加する。

<%#------ 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
...(途中省略)...


以上が、必要最小限の一括削除のコード。しかし、この状態ではまだまだ問題が多い。間違って削除操作してしまう可能性もあるし、確実に削除されたのかどうかも不安になる。これをベースに操作性を改良していく予定だ。