【Rails】初学者がDeviseを導入させてみた

## はじめに

初めまして。現役看護師をしながら、エンジニア転職を目指しRuby on Railsを勉強しています。
アウトプットのために、Devise を使ったユーザー認証の実装方法を調べながら試してみたので、その手順をまとめました。

---

## 記事内容

- Devise のインストール方法
- ユーザー登録 & ログインの実装
- Devise のビューをカスタマイズ
- `before_action :authenticate_user!` で認証を保護

---

## 完成イメージ

- `/users/sign_up` → ユーザー登録ページ
- `/users/sign_in` → ログインページ
- `/users/sign_out` → ログアウト（DELETE メソッドで実行）

---

## Devise のインストール

### ① Gem を追加

`Gemfile` に以下を追加し、`bundle install` を実行

```ruby
gem "devise"
```

```sh
bundle install
```

---

## Devise のセットアップ

① Devise のセットアップコマンドを実行

```sh
rails g devise:install
```

実行すると、いくつかの設定項目が表示される。

② `config/environments/development.rb` にメール送信の設定を追加

```ruby
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```

パスワードリセットなどのメールリンクが正しく動作するよようになる。

---

## User モデルの作成

① User モデルを Devise で作成

```sh
rails g devise User
```

このコマンドで `User` モデルが作成され、マイグレーションファイルも生成される。

② マイグレーションを実行

```sh
rails db:migrate
```

---

## Devise のルーティングを確認

`config/routes.rb` を確認すると、次のように `devise_for :users` が追加されているはず。

```ruby
Rails.application.routes.draw do
  devise_for :users
  root to: "home#index"  # ホームページを設定
end
```

`devise_for :users` だけで、ユーザー登録・ログイン・ログアウト・パスワードリセットなどのルートが自動で設定さるはず。

確認方法

```sh
rails routes | grep users
```

実行すると、以下のようなルートが表示される。

```bash
new_user_session  GET    /users/sign_in
user_session      POST   /users/sign_in
new_user_registration GET    /users/sign_up
user_registration POST   /users
```

`/users/sign_up` で新規登録  
`/users/sign_in` でログイン  
`/users/sign_out` でログアウト（DELETE メソッドが必要）

---

## ログイン必須のページを作成

ログインしていないユーザーを制限するには、`before_action :authenticate_user!` を。

例えば、`boards_controller.rb` を作成して、ログインしたユーザーのみが `index` を見られるようにするには以下のような感じになるらしい。

```ruby
class BoardsController < ApplicationController
  before_action :authenticate_user!  # ログインユーザーのみアクセス可能

  def index
    @boards = current_user.boards
  end
end
```

これで未ログインのユーザーがアクセスすると、自動でログインページにリダイレクトされる。

---

## Devise のビューをカスタマイズ

デフォルトの `Sign Up` や `Sign In` ページをカスタマイズしたい場合は、以下のコマンドを実行。

```sh
rails g devise:views
```

すると、`app/views/devise/` 以下に以下のようなフォルダが作成されます。

```
app/views/devise/
 ├── registrations/  # ユーザー登録関連
 │   ├── new.html.erb  # 新規登録ページ
 │   ├── edit.html.erb # プロフィール編集ページ
 ├── sessions/        # ログイン関連
 │   ├── new.html.erb  # ログインページ
```

これでログイン画面をカスタマイズ可能に

---

## 動作確認

### サーバーを起動

```sh
bin/rails server
```

### ブラウザでアクセス

- [http://localhost:3000/users/sign_up](http://localhost:3000/users/sign_up) → 新規登録ページ
- [http://localhost:3000/users/sign_in](http://localhost:3000/users/sign_in) → ログインページ

ログイン後、トップページ (`root_path`) にリダイレクトされるか確認を。

---

## まとめ

`rails g devise:install` で Devise をセットアップ  
`rails g devise User` で `users` モデルを作成  
`rails db:migrate` でマイグレーションを適用  
`devise_for :users` でログイン・ログアウトのルートが自動生成  
`before_action :authenticate_user!` で未ログインユーザーを制限  
`rails g devise:views` で `Sign Up / Sign In` ページをカスタマイズ  

これで Rails に Devise を導入し、認証機能を実装されました。

---

## 疑問

「ログイン後に特定のページへリダイレクトしたい」

```ruby
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
    boards_path  # ログイン後にボード一覧ページへリダイレクト
  end
end
```

「メール認証を追加したい」

```ruby
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
```

これを `db/migrate/xxxx_add_devise_to_users.rb` に追加し、`rails db:migrate` を実行。

---

Devise は、Rails の認証機能を実装できる便利な Gem であることを知りました
カスタマイズ性が高いのが、とても素晴らしいと感じました。
引き続き、学習を続けます。