TodoList: 所属変更のため2006年12月09日 10時17分20秒

user_engine を覗いても、edit.rhtml は存在しない。

% ls vendor/plugins/user_engine/app/views/user/
_roles.rhtml    edit_user.rhtml list.rhtml      new.rhtml       show.rhtm
% ls vendor/plugins/login_engine//app/views/user/
_edit.rhtml             edit.rhtml              login.rhtml
_password.rhtml         forgot_password.rhtml   logout.rhtml
change_password.rhtml   home.rhtml              signup.rhtml

http://localhost:3000/user/edit では login_engine から edit.rhtml から拾われてくるようだ。_edit.rhtml を app/views/user にコピーする。

実はここからが手間取った。プルダウンメニューをどの様にやればいいのか、知らないのだ。適当にプルダウンメニューのあるページを探して、HTML を見てみた。

その後は、rails で実装である。検索して、適当な例を探しているうちに、 Assigning a Category to Each Recipe を見つけた。ほぼ、そのまま今回やろうとしていることだ。


% cvs diff -u -r1.1 _edit.rhtml
...
     <%= form_input changeable(user, "lastname"), "Last Name","lastname" %>
     <%= form_input changeable(user, "login"), "Login ID", "login", :size => 30 %><br/>
     <%= form_input changeable(user, "email"), "Email", "email" %>
+
+    <select name="user[organization_id]">
+      <% Organization.find_all().each do |org| %>
+        <option value="<%= org.id %>"
+          <%= ' selected' if
+          org.id == User.find(@params[:id]).organization_id %>>
+          <%= org.name %>
+        </option>
+      <% end %>
+    </select>
+
     <% if submit %>
       <%= form_input :submit_button,
         (user.new_record? ? 'Signup' : 'Change Settings'), :class => 'two_columns' %>
     <% end %>

の分を _edit.rthml に追加する。何を渡せばいいのかを、試行錯誤した後に成功した。http://localhost:3000/user/edit_user/1 にアクセスすると、プルダウンメニューが現れる。残念ながら、このコードだと、プルダウンメニューが変な位置に現れた。今は、表示さえ出来れば良いので、気にしない。

その後、select を使う方法もあるのを知った。collection_select - 選択済みアイテムを元に試行錯誤を繰り返したら、期待通りに表示できるようになった。

以下が、select を使った場合だ。冗長な方と生成される HTML を比べるために、並べるように追記した。


% cvs diff -r 1.1 _edit.html
...
     <%= form_input changeable(user, "lastname"), "Last Name","lastname" %>
     <%= form_input changeable(user, "login"), "Login ID", "login", :size => 30 %><br/>
     <%= form_input changeable(user, "email"), "Email", "email" %>
+
+    <%= select :Organization, :id, 
+     Organization.find_all().map {|o| [ o.name, o.id ]},
+     :selected => User.find(@params[:id]).organization_id %>
+
    <select name="user[organization_id]">
      <% Organization.find_all().each do |org| %>
        <option value="<%= org.id %>"
          <%= ' selected' if


% cat add_organizations.mysql;
USE todos;
INSERT INTO organizations VALUES ( NULL, 'Drexel', 'Drexel University' );
INSERT INTO organizations VALUES ( NULL, 'CS', 'Computer Science Department' );
% !! | mysql
% mysql
mysql> USE todos;
Database changed
mysql> UPDATE users SET organization_id = 2 where id = 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

にて、データを入力。uyota を二つ目の所属にした。一つ目の所属だと、プルダウンメニューでしっかり初期値が設定されているかが、判別しづらいためだ。その後、http://localhost:3000/user/edit_user/1 アクセスし、ソースを見た。

   <tr class="two_columns">
    <select id="Organization_id" name="Organization[id]"><option value="1">Drexel</option>
<option value="2" selected="selected">CS</option></select>
   </tr>

    <select name="user[organization_id]">
      
        <option value="1"
          >
          Drexel
        </option>
      
        <option value="2"
           selected>
          CS
        </option>
      
    </select>

コードの出力は違うが、同じプルダウンメニューが出来ている。前者の <= select > の型を使おうと思う。

前回次回