Ruby on Rails Ver.3.2.0 DeviseのControllerをカスタマイズしたときにRSpecを書いてつまずいた記録

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のセッティングが間違っているのかと散々悩みました。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です