devise では、users モデルを認証対称として設定した場合、利用したモジュールに応じてがががっとルーティングが自動生成される。簡単な例だと
devise_for :users
とすると /users/sign_in
などが生成される。これを /users/signin
にしたい場合はこうする
devise_for :users, paths: {sign_in: 'signin'}
さらに /signin
にしたいよね〜ということは多々あるはずなので、こうする。
devise_for :users, paths: {sign_in: 'signin'}
devise_scope :users do
get '/signin', to: 'sessions#new', as: :new_user_session
end
こうすると、/signin
が devise が内部で使う :new_user_session として再定義されるので、未ログイン時のリダイレクトなどで使われるようになる。
しかし rails4 では as で指定する named routes がすでに定義されている場合は raise するようになってしまったのでこの方法を使うことができない。ログインするための url がバージョンアップで変わるというのは困る。
まず思いついたのがdevise_for
をいじる方法。
devise_for :users,
path: '',
paths: {sign_in: 'signin'}
上のようにすると /signin
は使えるようになるものの、/users
でアクセスしたいルーティング、例えば /users/password/...
というルーティングが /password/...
となってしまうので、これは困る。いろいろ調べた結果、以下の url に記載されている方法がベスト・プラクティスのようだ。
http://iampedantic.com/post/41170460234/fully-customizing-devise-routes
ようは、devise_for では routes を定義せずに、自分ですべてマッピングを作成せよということらしい。最終的にはこうなった。
devise_for :users, skip: [:sessions]
devise_scope :users do
get '/signin', to: 'sessions#new', as: :new_user_session
... # この先に sessions で本来定義されるはずの url がすべて書かれている
end
まあなんというか、ここまでやるなら omniauth 使って、薄く自分で作ったほうが楽だよねって話である。重厚すぎるライブラリはやっぱり好きになれないなあ。