- 更新日: 2013年12月3日
- Devise
Devise で devise_for メソッドによるルーティングを確認
前回 devise で認証機能を追加したので(Rails4 にて Devise でユーザー登録・ログイン認証・認可の機能を追加 | EasyRamble)、devise で生成されたデフォルトのルーティングを確認してみました。
環境
Rails 4.0.1
Devise 3.2.2
config/routes.rb は以下のとおり。
1 2 |
root 'home#index' devise_for :users |
devise_for メソッドによるルーティングを確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ bundle exec rake routes Prefix Verb URI Pattern Controller#Action root GET / home#index new_user_session GET /users/sign_in(.:format) devise/sessions#new user_session POST /users/sign_in(.:format) devise/sessions#create destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy user_password POST /users/password(.:format) devise/passwords#create new_user_password GET /users/password/new(.:format) devise/passwords#new edit_user_password GET /users/password/edit(.:format) devise/passwords#edit PATCH /users/password(.:format) devise/passwords#update PUT /users/password(.:format) devise/passwords#update cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel user_registration POST /users(.:format) devise/registrations#create new_user_registration GET /users/sign_up(.:format) devise/registrations#new edit_user_registration GET /users/edit(.:format) devise/registrations#edit PATCH /users(.:format) devise/registrations#update PUT /users(.:format) devise/registrations#update DELETE /users(.:format) devise/registrations#destroy |
なかなかカオスな感じ。
RESTful じゃないルーティングになっている
devise_for メソッドによるデフォルトでは、RESTful でないルーティングになってますね…。おかしい点を列挙すると、
・/users/.. の URI が devise/ 以下のコントローラーにルーティングされている。
・/users/.. の URI が devise/sessions コントローラーのアクションにルーティング。普通 /sessions/new などの URI に対応するのでは。
・devise/registrations は URI Pattern に出てこない。
・devise/registrations#edit は、/users/:id/edit にルーティングされるべきでは。devise/passwords#edit も同様。
・PATCH, PUT, DELETEリクエスト の URI Pattern は、通常 /users/:id などにルーティングされないといけない。
Rails のルーティング、というか REST な URI パターンを、英語の単数形・複数形とアクションが及ぼす対象を意識して覚えているので、この devise のルーティングはちょっと気持ち悪いです。
resources :users による通常のルーティング
devise を使わずに普通に、resources :users とルーティングした場合は以下のようになって美しいです。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ bundle exec rake routes Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy |
Devise との対応は以下のようになる。
users#index → なし
users#create → devise/registrations#create
users#new → devise/registrations#new
users#edit → devise/registrations#edit
users#show → なし
users#update → devise/registrations#update
users#destroy → devise/registrations#destroy
users#index, users#show のルーティングは Devise により生成されていないので、自力でルーティングを作る必要があります。普通に、resources :users とすると、devise_for :users で自動生成されるルーティングと衝突して訳が分からなくなりそうです。users#index, users#show のルーティングは1つずつ作ったほうが良さそう。
以上を考慮して、さてどうしましょうか。devise_for メソッドを使わずにルーティングを全部一から自分で作るか(動作するか不明)、プラグインを使う利便性と割りきって利用するかどちらかですかね。また、Devise コントローラーを継承したカスタムコントローラーを作成して、ルーティングがどう変わるか試してみよう。
ググったらルーティングを変更する gem を作っておられる方を発見しました。
- Devise の関連記事
- RailsのDevise認証機能での実装チェックリストまとめ
- Deviseで送信されるメールのfrom(送信者メールアドレス)を変更
- Facebook の OAuth 認証で OAuthException(191)エラー
- Rails Devise でパスワードリセットなどのメールテンプレート(Mailer ビュー)をカスタマイズ
- Rails + Devise 環境でのフレンドリーフォワーディング機能を修正
- Deviseでユーザー登録完了時にウェルカムメールを送信する
- Rails Devise でユーザーがプロフィール情報を更新後に元のページにリダイレクトさせる
- Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可
- Rails Deviseの日本語化辞書ファイル(devise.ja.yml)
- Rails + Devise で admin ユーザー(管理者)を削除できないようにする
Leave Your Message!