Deviseでこれをやってておくれそうになったはなし
たとえば管理者と一般ユーザーを使い分けたいときってよくありますよね。今回それに出くわしまして、Deviseで何とかしてみました。
まずはDeviseを使った管理者と一般ユーザーのモデルを作ります。
rails g devise users rails g devise admin
みたいな感じでどんどん作れます。たくさん作る意味はあるのか知りませんが…
それから、config/routes.rbを修正します。特に何か特別なことをしたいわけではないなら、上のコマンドを打ったときに書き加えられているので特になにかする必要はありません。
devise_for :users, :controller => { :sessions => "users/sessions", :registrations => "users/registrations" } devise_for :admin, :controller => { :sessions => "admin/sessions", :registrations => "admin/registrations" }
ログイン時の操作をカスタマイズしたいときはDevise::SessionsController、登録時の操作をカスタマイズしたいときはDevise::RegistrationsControllerを継承したクラスを作ってごにょごにょします。上の例だと、
app/ controllers/ users/ sessions_controller.rb registrations_controller.rb admin/ sessions_controller.rb registrations_controller.rb
みたいな感じにファイルを作ってごにょごにょします。
たとえばログインやユーザー登録に成功しときのリダイレクト先を変えるときは、Devise::SessionsController#after_login_path_forといったメソッドをオーバーライドするとできます。
#ログインに成功した後のリダイレクト先を変える class Admin::SessionsController < Devise::SessionsController def after_sign_in_path_for(resource=nil) admin_index_path end end
あとは認証が必要なコントローラーの上の方に
before_filter :user_authenticate! #一般ユーザーのログインが必要 before_filter :admin_authenticate! #管理者でのログインが必要
と書き加えておけばOKです。
ただこれ、今回は結構面倒なことになってしまったので、また別の方法を探っています。いい方法ないかなーと思っていたら良さそうなGemを紹介してもらったのでそれを試してみようと思います。それについても後ほど。