deviseのちょっと応用の使い方です。
目次
deviseで複数モデルを管理するときのルーティング
deviseで2つのモデルを管理するときはたいてい以下のようなルーティングを設定すると思います。
# routes.rb devise_for :users, :controllers => { :sessions => 'admin_users/sessions', :passwords => 'admin_users/passwords', :registrations => 'admin_users/registrations', } devise_for :admin_users, :controllers => { :sessions => 'admin_users/sessions', :passwords => 'admin_users/passwords', :registrations => 'admin_users/registrations', }
上記ルーティングの問題点
この場合、userのsignup(registrations#create)のpostのパスが/users
です。
devise以外でcreateとupdateをしようとして
resouces :users
と記述してもpostのパスが/users
でかぶってしまいます。
ルーティングは上から読み込まれるので、上に書いた方のパスにpostされます。
devise以外でcreate,updateできない
devise以外でcreateとupdateが上記パスだとパスが被ってしまうためできないです。
views/users/new.html.erb
でform_forでpostしてもなぜかdeviseを通っていて、logを見てみたら判明しました。
解決方法
deviseのルーティングのオプションを使います。skip
オプションを使うとdeviseで生成される標準のルーティングを生成しないことができます。
その上でresouces :users
などと被らないパスを設定してあげればOKです。
devise_for :users, skip: [:sessions, :passwords, :registrations ] devise_scope :user do get 'users/sign_up' => 'users/registrations#new' post 'users/create' => 'users/registrations#create' end
パスワードの扱い
deviseのcontrollerクラスを通さなくても、devise管理であることをモデルに記述していれば、postでパスワードを暗号化してくれます。つまり普通にpostしてあげればOKです。
registrations#create
本当はadmin_userでuserの追加をusers/registrations#createでできればよかったのですが、createするとsign inもしてしまってユーザーの連続作成ができませんでした。(できる方法ないかなー)
コメントを残す