3
1

More than 1 year has passed since last update.

【Rails】Deviseをカスタマイズして使いたい!!(ルーティング編)

Last updated at Posted at 2023-02-12

どうした?

前回の記事では、Deviseを導入しUserモデルを作成しました。

今回の記事では、

  • ルーティングを設定し、URLとパスをカスタマイズ
  • コントローラファイルを作成し、アクションを設定
  • ビューファイルを用意し、ページにアクセスする

を目標に進めていきます。

今回目指すもの

前回作成したUserモデルに対して、以下の処理をするためのルーティングを作成していきます。

registrations_controller

HTTPリクエスト パス URL アクション 処理内容
get new_user sign_up new ユーザーの新規作成フォーム
post users users create ユーザーの新規作成ができる
get edit_user users/:id/edit edit ユーザー情報の編集フォーム
patch user users/:id update ユーザー情報の編集ができる

sessions_controller

HTTPリクエスト パス URL アクション 処理内容
get login login new ユーザーのログインフォーム
post login create ユーザーがログインできる
destroy logout logout delete ユーザーがログアウトできる

手順

ルーティングの設定

まずは usersに対してルーティングを設定していきます。

routes.rb
devise_for :users

このままではコントローラがないため、ルーティングは機能しません。
コントローラファイルを作っていきましょう。

コントローラファイルの作成

まずはページアクセスのためにコントローラファイルを準備します。

$ rails generate devise:controllers users

これにより、app/controllersフォルダ内にusersフォルダといくつかのコントローラファイルが生成されます。
生成されたusersフォルダの中身は以下のようです。

  • users
    • confirmations_controller.rb
    • omniauth_callbacks_controller.rb
    • passwords_controller.rb
    • resistrations_controller.rb
    • sessions_controller.rb
    • unlocks_controller.rb

このうち必要なものはresistrations_controller.rbsessions_controller.rbなので、それ以外は削除してしまいましょう。

resistrations_controller.rb

このコントローラでは、ユーザー作成と編集が行えるようにします。

ルーティングの設定

ルーティングファイルにて「Users::RegistrationsControllerを使うよ」という宣言をします。

# 認証
devise_for :users, controllers: {
  registrations:  'users/registrations'
}

これにより、Deviseは自動で以下のルーティングを生成します。

$ rails routes | grep users

cancel_user_registration    GET       /users/cancel(.:format)       users/registrations#cancel
new_user_registration       GET       /users/sign_up(.:format)      users/registrations#new
edit_user_registration      GET       /users/edit(.:format)         users/registrations#edit
user_registration           PATCH     /users(.:format)              users/registrations#update
                            PUT       /users(.:format)              users/registrations#update
                            DELETE    /users(.:format)              users/registrations#destroy
                            POST      /users(.:format)              users/registrations#create

各アクションの設定

resistrationsコントローラのnewアクションを設定しましょう。

コントローラファイルを見ると、各アクションがコメントアウトされています。
newアクションを使用するので、コメントアウトを取り消しましょう。

# GET /resource/sign_up
def new
  super
end

newアクションの中身を見ると、superとだけ書かれています。
superということは、親クラスであるDevise::RegistrationsController継承しているようです。
今の所は無視して進めます。

ビューファイルの作成

ビューファイルを用意してusers/newページを表示させましょう。
ルーティングを確認すると

new_user_registration       GET       /users/sign_up(.:format)      users/registrations#new

とあるので、ビューファイルはapp/views/users/resistrationsフォルダ内に作れば良いことが分かります。

試しに空のnew.html.erbファイルを作成してみます。
/users/sign_upにアクセスしてみると、無事にページを開けていることが分かります。

sessions_controller

このコントローラでは、ユーザーがログインとログアウトを行えるようにします。

resistrations_controllerと同様の手順で作業します。

まずは、ルーティングを追加しましょう。

devise_for :users, controllers: {
  registrations:  'users/registrations', # カンマで区切るのを忘れない!
  sessions:       'users/sessions'
}

ルーティングを確認すると、

new_user_session            GET       /users/sign_in(.:format)      users/sessions#new
user_session                POST      /users/sign_in(.:format)      users/sessions#create
destroy_user_session        DELETE    /users/sign_out(.:format)     users/sessions#destroy

が追加されているので、new.html.erbはapp/views/users/sessionsフォルダ内に作れば良いことが分かります。

ビューファイルを作成したら、sessionsコントローラにてnewアクションのコメントアウトを取り消しましょう。

/users/sign_inにアクセスすることができるかと思います。

URLとパスをカスタマイズしよう

現在のURLやパスはDeviseが自動で作成したものです。
これを、設計に沿って変更しましょう。

ルーティングファイルを以下のように修正します。

devise_for :users, controllers: {
  registrations:  'users/registrations',
  sessions:       'users/sessions'
}, skip: [:registrations, :sessions]
devise_scope :user do
  get       'sign_up', to:            'users/registrations#new',      as: :new_user
  post      'users', to:              'users/registrations#create'    as: :users
  get       'users/:id/edit', to:     'users/registrations#edit',     as: :edit_user
  patch     'users/:id', to:          'users/registrations#update'    as: :user

  get       'login', to:              'users/sessions#new',           as: :login
  post      'login', to:              'users/sessions#create'
  delete    'logout', to:             'users/sessions#destroy',       as: :logout
end
  • devise_forブロックでは、コントローラの呼び出し
  • skip:では、devise_forが自動で作成したルーティングを削除(カスタマイズしたい為)
  • devise_scopeでは、URLとアクションの指定
  • as:では、パスの指定
    をしています。

ルーティングを確認すると

$ routes | grep users

new_user        GET    /sign_up(.:format)          users/registrations#new
users           POST   /users(.:format)            users/registrations#create
edit_user       GET    /users/:id/edit(.:format)   users/registrations#edit
user            PATCH  /users/:id(.:format)        users/registrations#update
login           GET    /login(.:format)            users/sessions#new
                POST   /login(.:format)            users/sessions#create
logout          DELETE /logout(.:format)           users/sessions#destroy

が得られます。

/sign_upにアクセスすると、無事にページが表示されています。

まとめ

今回はルーティングを設定しました。
次回はコントローラとビューファイルを整えて、

  • ユーザー作成
  • ログイン

ができるようにします。

最後までお読みいただきありがとうございました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1