Top > Ruby on Railsあれこれ > 複数従業員情報の一括削除

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
<html>
<head>
  <title>Tutorial: Employee Bulk Delete</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <%= stylesheet_link_tag 'ror' %>
</head>
<body>
<h2>Tutorial: Employee Bulk Delete</h2>
<table border="1">
  <tr style="background-color:pink">
    <th>Id</th><th>Name</th><th>JobType</th><th>Salary</th><th>Department</th>
  </tr>
  <% for e in @employees %>
  <tr style="background-color:<%= cycle('white', 'yellow') %>">
    <td align="right"><%=h e.id %></td>
    <td><%=h e.name %></td>
    <td><%=h e.job_type %></td>
    <td align="right"><%= number_with_delimiter(e.salary, delimiter=",") %></td>
    <td><%=h e.department.name %></td>
  </tr>
  <% end %>
</table>
  
<% form_tag({:action => 'choose'}) do %>
  <%= submit_tag "一括削除処理へ" %>
<% end %>
  
</body>
</html>

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
<html>
<head>
  <title>Tutorial: Employee Bulk Delete</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <%= stylesheet_link_tag 'ror' %>
  <% javascript_tag do %>
   function checkAll(form, pattern, checked){
     reg = new RegExp(pattern);
     for(i=0;i<=form.length-1;i++){
       if(form.elements[i].type * "checkbox" && form.elements[i].name.match(reg) ){
         form.elements[i].checked = checked;
       }
     }
   }
  <% end %>
</head>
<body>
   
<h2>一括削除入力</h2>
  
  <% form_tag({:action => "confirm"}, {:name => "ChooseForm"}) do %>
  <%= button_to_function "全選択", "checkAll(this.form, 'delete_check', true)" %>
  <%= button_to_function "全解除", "checkAll(this.form, 'delete_check', false)" %>
    <table border="1">
      <tr>
        <th>&nbsp;</th>
        <th>Name</th>
        <th>JobType</th>
        <th>Salary</th>
        <th>Department</th>
      </tr>
      <% @departments = Department.find(:all) %>
      <% for @employee in @employees %>
      <tr>
        <td>
          <%= hidden_field("employee[]", "id") %>
          <%= check_box("employee[]", "delete_check") %>
        </td>
        <td><%=h @employee.name %></td>
        <td><%=h @employee.job_type %></td>
        <td><%=h @employee.salary %></td>
        <td><%=h r_label(@employee.department_id, @departments, "id", "name") %></td>
      </tr>
      <% end %>
    </table>
    <br />
    <%= submit_tag "削除内容確認" %>
    <%= submit_tag "戻る", {:type => "button", :onClick => "this.form.action='/bulk_delete/index'; this.form.submit();"}%>
  <% end %>
  </body>
</html>

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
<html>
<head>
  <title>Tutorial: Employee Bulk Delete</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <%= stylesheet_link_tag 'ror' %>
</head>
<body>
   
<h2>一括削除内容確認</h2>
 
<table border="1">
  <tr style="background-color:pink">
    <th>Id</th><th>Name</th><th>JobType</th><th>Salary</th><th>Department</th>
  </tr>
  <% for e in @employees %>
  <% next if e.delete_check != "1" %>
  <tr style="background-color:<%= cycle('white', 'yellow') %>">
    <td align="right"><%=h e.id %></td>
    <td><%=h e.name %></td>
    <td><%=h e.job_type %></td>
    <td align="right"><%= number_with_delimiter(e.salary, delimiter=",") %></td>
    <td><%=h r_label(e.department_id, @departments, "id", "name") %></td>
  </tr>
  <% end %>
</table>
  
<% form_tag :action => 'delete' do %>
  <%= submit_tag "削除", {:confirm => '後悔しない?'} %>
  <%= submit_tag "戻る", {:type => "button", :onClick => "this.form.action='/bulk_delete/choose'; this.form.submit();"}%>
<% end %>
  
</body>
</html>
  0
attr_accessor :delete_check
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
class Employee < ActiveRecord::Base
 
  belongs_to :department, :foreign_key => 'department_id'
  belongs_to :address, :foreign_key => 'address_id'
  
  validates_presence_of :name, :salary, :message => "を入力して下さい"
  
  attr_accessor :update_check, :delete_check
  
  #バリデーションエラーメッセージ内のプロパティ名を日本語にマッピングします。
  class << self
    HUMANIZED_ATTRIBUTE_KEY_NAMES = {
      "name" => "氏名",
      "salary" => "給与額"
    }
  
    def human_attribute_name(attribute_key_name)
      HUMANIZED_ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
    end
  end
  
end
  0
  1
class Department < ActiveRecord::Base
end
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
  #SAStrutsのf:labelと同じ機能のメソッド
  #id→nameの変換を行います。
  #パラメータ説明
  # target_id : nameに変換したいid
  # objs : idとnameを持つモデルのリスト
  # id_method : モデルからidを取得するためのメソッド名(=プロパティ名)
  # name_method : モデルからnameを取得するためのメソッド名(=プロパティ名)
  def r_label(target_id, objs, id_method, name_method)
  
    for obj in objs
      #オブジェクトのメソッドの動的な呼び出しを行っています。
      #id_methodに設定されている名前のメソッドを呼び出します。
      id = obj.__send__(id_method)
      if id * target_id
        return obj.__send__(name_method)
      end
    end
    return ""
  end
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
class BulkDeleteController < ApplicationController
  
  #一覧画面表示
  def index
    @employees = Employee.find(:all, :include=>:department)
    session[:employees] = @employees;
    render :action => 'index.html.erb'
  end
  
  #編集画面表示
  def choose
    @employees = session[:employees]
    render :action => 'choose.html.erb'
  end
  
  #確認画面表示
  def confirm
    @employees = convert(sort(params[:employee]))
    if @employees.size * 0
      render :action => 'choose.html.erb'
      return
    end  
    
    session[:employees] = @employees
    @departments = Department.find(:all)
    render :action => 'confirm.html.erb'
  end
  
  #データベース更新
  def delete
    @employees = session[:employees]
    
    begin
      #トランザクション開始
      ActiveRecord::Base.transaction {
        for e in @employees
          next if e.delete_check != "1"
          #削除
          e.destroy
        end
      }
    rescue => ex
      #例外発生時の処理を記述します。
      render :text => ex
      return
    ensure
      session[:employees] = nil
    end
    index
  end
  
  #リクエスト→モデルに変換メソッド(private)
  def convert(objects)
    employees = Array.new
    objects.each { |o|
      e = Employee.find(o[1]["id"])
      e.id = o[1]["id"]
      e.delete_check = o[1]["delete_check"]
      employees.push(e)
    }
    return employees
  end
  private :convert
  
  #Formから送られてくると、順番がおかしくなっているので
  #画面の表示順番通りになるようにソートする(private)
  def sort(objects)
    objects = objects.sort{|a, b|
     a[0].to_i <=> b[0].to_i
    }
    return objects
  end
  private :sort
  
end

添付ファイル: filedb_tuto_bdel_5.jpg 279件 [詳細] filedb_tuto_bdel_4.jpg 299件 [詳細] filedb_tuto_bdel_3.jpg 298件 [詳細] filedb_tuto_bdel_2.jpg 284件 [詳細] filedb_tuto_bdel_1.jpg 316件 [詳細]

リロード   新規 編集 凍結解除 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2012-08-08 (水) 23:25:46 (3001d)