Deviseでdevise_forをネストした場所に書く方法

目次

概要

RailsでWebアプリケーションを開発していて、ユーザ管理にdeviseを使っているのですが、ユーザ管理のURLをadmin以下に置いて、/admin/users/sign_inとしたいと思いました。

最終的に実現はしたのですが、試行錯誤があったためどのようにして実現したのかを紹介します。

失敗した方法

失敗した方法とは書いていますが、この方法でも実現できない訳ではなく、実現のためにかかる作業が多いためあまりおすすめできません。

おそらく、まず最初に思いつく方法が、namespace内に書く方法だと思います。

namespace :admin do
  devise_for :users
end

このようにした場合、Controllrをadminディレクトリに用意する必要があり、さらにパスやURLを生成するメソッド名のプレフィックスがnew_user_sessionからadmin_new_user_sessionのように変わったため、変更箇所が多くなってしまい、変更する箇所が多くなってしまいます。

変更する箇所が多いということは、バグを生み出しやすいということです。そのためもっといいやり方があるのではないかと調べたら見つけることができました。

実現方法

これから紹介する方法では、routsのみの変更で実現することができます。

namespaceの中でdevise_forを書いているためこのようになっているので、namespaceの外に書き、さらにパスを指定します。

devise_for :users, path: 'admin/users'

path: ‘admin/users’のように指定することで、プレフィックスやControllerのディレクトリを変えずにURLのみを変更することができます。

まとめ

調べていく過程で、Deviseのカスタマイズは非常に難しいということが分かりました。

同じことで悩んでいる人の参考になれば幸いです。