中間テーブルを用いた多対多の関係(その 2)

前回はアソシエーションを定義するところまで進めました。今回はそのアソシエーションを実際に利用してみます。まずはコントローラーから。

rails g controller employees index show

モデルに対応するテンプレートを作成します。
app/views/employees/_employee.html.erb

<table border>
  <tr><th>従業員名</th><td><%= employee.name %></td></tr>
  <tr><th>年齢</th><td><%= employee.age %></td></tr>
  <tr><th>月収</th><td><%= employee.salary %></td></tr>
  <tr><th>性別</th><td><%= employee.sex.name %></td></tr>
  <tr>
    <th>取得資格</th>
    <td><%== employee.licenses.empty? ? 'なし' : employee.licenses.map{ |l| l.name }.join(tag :br) %></td>
  </tr>
</table>

<%== ... %> はタグをエスケープしない記法です。安全が確認されているとき以外は使わないようにしましょう。employee.licenses で、アソシエーションによってひも付いた License のリストを取得できます。
他の View も作ります。
app/views/employees/index.html.erb

<h1>従業員一覧</h1>
<table border>
  <thead>
    <tr><th>従業員 ID</th><th>従業員名</th><th></th></tr>
  </thead>
  <tbody>
  	<% @employees.each do |e| %>
    <tr>
      <td><%= e.id %></td>
      <td><%= e.name %></td>
      <td><%= button_to '詳細', employee_path(e.id), :method => :get %></td>
    </tr>
    <% end %>
  </tbody>
</table>

app/views/employees/show.html.erb

<h1><%= @employee.name %>さんの情報</h1>
<%= render @employee %>
<p><%= link_to '一覧に戻る', employees_path %></p>

ルーティングの設定も忘れずに。
config/routes.rb

Sample2::Application.routes.draw do
  resources :employees
  # (略)
end

Sample2 のところは実際に作ったアプリケーション名に読み替えてください。

サーバを起動して http://localhost:3000/employees にアクセスして確認してみましょう。

「詳細」ボタンをクリックすると…。

こんな感じになりましたか ?