ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

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を紹介してもらったのでそれを試してみようと思います。それについても後ほど。