TodoList: 団体に属する人達2007年01月13日 12時31分37秒

忘れていた。各所属団体 (Organization) に所属する人達 (User) の情報も見られる様にする必要がある。Todo を割り当てる機能を付ける予定だったのだから、他のユーザ (User) がわからなければ困る。

app/views/user/list.rhtml があるが、user_engine がこれを使い、様々な設定が出来るようになっている。これに、ユーザの役割 (Role) によって更に制限を掛けて、見られる項目を変更するのは骨が折れそうだ。。

そこで、app/views/organization を変更する。app/controlers/organization_controller.rb で scaffold :organiation をやっているので、まずはテンプレートの作成から。


% ruby script/generate scaffold organization organization
      exists  app/controllers/
      exists  app/helpers/
      exists  app/views/organization
      exists  test/functional/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
        skip    app/models/organization.rb
   identical    test/unit/organization_test.rb
   identical    test/fixtures/organizations.yml
      create  app/views/organization/_form.rhtml
      create  app/views/organization/list.rhtml
      create  app/views/organization/show.rhtml
      create  app/views/organization/new.rhtml
      create  app/views/organization/edit.rhtml
overwrite app/controllers/organization_controller.rb? [Ynaq] y
       force  app/controllers/organization_controller.rb
overwrite test/functional/organization_controller_test.rb? [Ynaq] n
        skip  test/functional/organization_controller_test.rb
   identical  app/helpers/organization_helper.rb
      create  app/views/layouts/organization.rhtml
   identical  public/stylesheets/scaffold.css

二段式 render partial でビューを変更する。_users.rhtml を作り、表の枠を作成し、その中から、_user.rhtml を collection を使って呼びユーザ (User) を表示する。

二段式にすると、もし他の場面で呼び出したくなった場合に便利だからだ。もし、show.rhtml で表を作り render partial collection を呼ぶと、他から呼ぶ場合に、表をもう一度作り直す必要が出て来る。逆に partial の内部で、表を作って各ユーザを表示すると、ユーザ毎にループが必要になる。ループを書くのを避けるためだ。

organization/show.rhtml をまず修正する。


% cvs diff app/views/organization/show.rhtml
diff -u -r1.1 show.rhtml
--- app/views/organization/show.rhtml   7 Jan 2007 05:24:27 -0000       1.1
+++ app/views/organization/show.rhtml   7 Jan 2007 05:53:54 -0000
@@ -4,5 +4,7 @@
 </p>
 <% end %>
 
+<%= render(:partial => 'users') %>
+
 <%= link_to 'Edit', :action => 'edit', :id => @organization %> |
 <%= link_to 'Back', :action => 'list' %>

次は organization/_users.rhtml と organization/_user.rhtml だ。


% cat app/views/organization/_user.rhtml
<%= error_messages_for 'user' %>

<tr>
  <td>
    <%= user.fullname %>
  </td>
  <td>
    <%= user.email %>
  </td>
  <td>
    <%= user.title %>
  </td>
  <td>
    <%= user.phone %>
  </td>
  <td>
    <%= user.address %>
  </td>
  <td>
    <%= Language.find(user.language_id).name if user.language_id %>
  </td>
</tr>
% cat app/views/organization/_users.rhtml
<%= error_messages_for 'users' %>

<table id="user_list" class="object_list">
  <tr>
    <th>Fullname</th>
    <th>Email</th>
    <th>Title</th>
    <th>Phone</th>
    <th>Address</th>
    <th>Language</th>
  </tr>

<%= render(:partial => 'user',
  :collection =>
    User.find(:all, :conditions => [ "organization_id = ?", params[:id]]))
%>

</table>

もう少し綺麗に書ければいいのだが、今回は手っ取り早く全て羅列した。

前回次回