リストを並べ替える
|
『覚え書き』で、簡単な名簿管理アプリを作りました。かなり簡単に作れましたが、業務に生かすためにはまだまだ技術の習得が必要でしょう。
そこで、今回はリストの並べ替えに挑戦してみました。
[scaffold]が生成する足場では、リスト(list.rhtml)は[id]順です。けれども名簿に登録された人数が増えれば、名前順なり、所属順なり、あるいは登録の逆順なりに並んでいて欲しくなります。
リストを任意のキーでソートする
では、早速改造に掛かりましょう。
まず、app/views/people/list.rhtml を開きます。今回は、表の見出し部をクリックするとその並びになるようにしましょう。そこで、見出部を次のようにします。
<tr>
<th><%= link_to '氏名', :action => 'orderName' %></th>
<th><%= link_to '所属', :action => 'orderOrgId' %></th>
<th><%= link_to 'eメール', :action => 'orderEMail' %></th>
<th colspan="3"><%= link_to '登録順', :action => 'orderNew' %>/<%= link_to '更新順', :action => 'orderUpdate' %></th>
</tr>
|
[氏名]をクリックしたら[orderName]が実行され、[所属]をクリックしたら[orderOrgId]が実行され、……以下略。アクションの名前は好きに決めて下さい。
実行されるアクションは app/controllers/people_controlles.rb に記述します。
まず、並び替えの実現ですが、これは、
def list
@person_pages, @people = paginate :people, :per_page => 10, :order => $orderPeople
end
|
[:order => "id"]のように、ソートのキーフィールドを指定します。ここでは、フィールド名を変数にしています。ついでに変数の初期値も入れておきましょう。
def list
$orderPeople = 'id' if $orderPeople == nil
@person_pages, @people = paginate :people, :per_page => 10, :order => $orderPeople
end
|
あとは、$orderPeople の値を変えてやれば並べ替えも自由自在です。
それではアクションを記述しましょう。
people_controlles.rb の後ろの方に、以下を追加します。
def orderName
$orderPeople = 'name'
index
end
def orderOrgId
$orderPeople = 'orgId'
index
end
def orderEMail
$orderPeople = 'eMail'
index
end
def orderNew
$orderPeople = 'created_on DESC'
index
end
def orderUpdate
$orderPeople = 'updated_on DESC'
index
end
|
DESC は、言わずと知れた降順指定です。では、
http://localhost:3000/people/
にアクセスして、確認してみましょう。どうですか? 並び順が変わったでしょう?
ここでは、$orderPeople というグローバル変数を使っていますが、session とどちらが良いのかは、私には判りません。
トップページへのリンク
トップページからのリンクは作りましたが、逆はまだでした。いちいち http://localhost:3000/ を打つのも鬱なんで、リンクを作ります。場所は、……app/views/layouts 以下のファイルにしましょう。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>People: <%= controller.action_name %></title>
<%= stylesheet_link_tag 'scaffold' %>
</head>
<body>
<p style="color: green"><%= flash[:notice] %></p>
<%= yield %>
<p>
<hr height="1" color="black" noshade />
<%= link_to 'Top', :controller => 'welcome', :action => 'index' %>
</p>
</body>
</html>
|
これだけです。layouts 以下のファイルに書いておけば、各画面に反映されます。
タイトル部をクリックすると並び変わります。右の[登録順][更新順]をクリックすると、それぞれ降順に並びます。
今回は[people]の並べ替えを行いました。[organizations]も同様に改造しておくと便利でしょう。やり方は同じですので、ここには記しません。
『名簿管理』アーカイブ
|
|