TodoList: 所属先の入力を保存2006年12月10日 13時53分04秒

さて、_edit.rhtml の入力画面は出来た

<%= @params[:id] %> を _edit.rhml に追加して、どのような値が渡されてくるのかを実験する。http://localhost:3000/user/list にアクセスした後、ユーザの編集をクリックする。以下の例では、uyota を編集してみることにした。

{"user"=>{"lastname"=>"Administrator",
"firstname"=>"System", "login"=>"uyota"},
"submit"=>"Change Settings", "action"=>"edit_user", 
"id"=>"1", "controller"=>"user",
"organization"=>{"id"=>"1"}}
params[:organization][:id] でアクセス出来るのが分かる。

vendor/plugins/user_engine/app/controllers から app/controllers に user_controller.rb をコピーする。edit_user に飛ばされるので、edit_user 関数を見る。user.save の前に organization_id を設定すればよい。


% cvs -u10 diff app/controller/user_controller.rb
--- app/controllers/user_controller.rb  9 Dec 2006 04:37:12 -0000       1.1
+++ app/controllers/user_controller.rb  9 Dec 2006 04:36:42 -0000
@@ -39,20 +39,21 @@
 
   # Edit the details of any user. The Role which can perform this will almost c
ertainly also
   # need the following permissions: user/change_password, user/edit, user/edit_
roles, user/delete
   def edit_user
     if (@user = find_user(params[:id]))
       @all_roles = Role.find_all.select { |r|
         r.name != UserEngine.config(:guest_role_name) }
       case request.method
         when :get
         when :post
           @user.attributes = params[:user].delete_if { |k,v|
             not LoginEngine.config(:changeable_fields).include?(k) }
+          @user.organization_id = params[:organization][:id]
           if @user.save
             flash.now[:notice] = "Details for user '#{@user.login}' have been updated"
           else
             flash.now[:warning] = "Details could not be updated!"
           end
       end
     else
       redirect_back_or_default :action => 'list'
     end
   end

これで、ユーザの所属を変更できるようになった。

しかし、今の時点では二つの問題がある。プルダウンメニューの出る位置が、"First Name" の上になってしまい見栄えが悪いのだ。出来れば、"Email" の下に出したい。見栄えは悪いが動作検証が目的で Todo を拡張しているので、後で機会があるか、気が向いたら見直すことにする。

もう一つは、一度組織に所属したら、無所属になれないことだ。こちらは、是非直したい部分ではあるが、今回は見送ることにする。まずは、他の機能を充実させてからにしたい。

なお、_edit.rhml を login_engine から持ってきたため、user_controller.rb も login_engine の方を見ていた。今回は、app 以下にコピーせずに vender 以下で試していた。実は、user_controller.rb は user_engine から取られていたのだった。コピーしなかった故に、いくらファイルを編集しても、変更が反映されずに随分無駄な時間を費やしてしまった。恐らく、app 以下に login_engine のをコピーしていれば、user_engine のコードに適合せずに一目瞭然な形のエラーが出たと思われる。そういった意味でも、vender 以下は直接編集せずに app にコピーした方がいいようだ。

前回次回