Deviseのコントローラをカスタマイズするためには、config/routes.rbを下記のように変更します。
devise_for :users, :controllers => {
:sessions => “users/sessions”,
:registrations => “users/registrations”,
:passwords => “users/passwords”
}
この例ではdeviseをuserとして使っている場合です。
この場合はapp/controllers/配下に新しくusersフォルダを作成しますが、app/controllers/配下に直にファイルを作成してもOK。
ちなみにそのばあいは:sessions => “sessions”とかになります。
また、session用、registrations用、passwords用と作っていますが、deviseに設定した機能によっても違いますし、もちろんカスタマイズの必要がなければ書かなければいいだけのことです。自分が使っているdeviseのcontrollerを知りたければrake routesで調べましょう。
app/controllers/users/sessions_controller.rb
app/controllers/users/registrations_controller.rb
app/controllers/users/passwords_controller.rb
を作成してそれぞれdeviseのクラスを継承します。sessions_controllerの場合は書きのような感じ。
class Users::SessionsController < Devise::SessionsController
end
app/controllers/直下にsessinos_controllerを作った場合は
class SessionsController < Devise::SessionsController
end
となります。
これであとはメソッドをオーバーライドするなり、before_filterをつかって処理を追加するなりすればいいです。
これで一通り動作することを確認。
ところがRSpecファイルでテストを書こうとすると、
Failure/Error: get(:create)
AbstractController::ActionNotFound:
Could not find devise mapping for path “/users/sign_in”.
Maybe you forgot to wrap your route inside the scope block? For example:devise_scope :user do
match “/some/route” => “some_devise_controller”
end
みたいなエラーがでます。
下記のようにdeviseのmappingを指定する処理を各テストの前に実行すればよい模様。
before do
request.env[‘devise.mapping’] = Devise.mappings[:user]
end
エラーメッセージにあるようにconfig/routesのセッティングが間違っているのかと散々悩みました。