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 > の型を使おうと思う。

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2006/12/09/990231/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。