トップ «前の日記(2014/08/11 (月) ) 最新 次の日記(2014/08/13 (水) )» 編集 RSS feed

HsbtDiary


2014/08/12 (火) [長年日記]

[devise][rails][ruby] Rails4 で devise を使ってカスタムルーティングを作る術

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 使って、薄く自分で作ったほうが楽だよねって話である。重厚すぎるライブラリはやっぱり好きになれないなあ。