【Rails備忘録】ユーザー管理機能を実装する手順まとめ（devise・バリデーション・日本語化・RSpecテスト）

## はじめに
本記事では、Railsアプリにおける「ユーザー管理機能（新規登録・ログイン）」の実装手順を、復習と備忘録を兼ねてまとめます。
ユーザー管理にはdeviseを利用するので、devise導入からバリデーション、日本語化、テストまで一通りの流れになります。

---

## 1. deviseの導入

**Gemfile**

```ruby
gem 'devise'
```

**コマンド**

```sh
bundle install
rails generate devise:install
```

**解説:**  
- deviseはユーザー認証の定番gemで、インストール後にセットアップコマンドで初期設定ファイルが生成される

---

## 2. Userモデルの作成

**コマンド**

```sh
rails generate devise User
rails db:migrate
```

**解説:**  
- devise用のUserモデル・テーブルを自動生成
- `db/migrate/`配下のマイグレーションでusersテーブルが作られる

---

## 3. Userモデルのバリデーション追加

**ファイル:** user.rb

```ruby
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  # バリデーションを追加
  validates :nickname, :last_name, :first_name, :last_kana, :first_kana, :birthday, presence: true

  # パスワードのバリデーション
  validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: 'は半角英数字を両方含む必要があります' }, allow_nil: true

  # 名前(全角)のバリデーション
  validates :last_name, :first_name, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: 'は全角（漢字・ひらがな・カタカナ）で入力してください' }

  # 名前カナ(全角)のバリデーション
  validates :last_kana, :first_kana, format: { with: /\A[ァ-ヶー]+\z/, message: 'は全角（カタカナ）で入力してください' }
end
```

**解説:**  
- deviseの標準バリデーションに加え、独自の必須・形式バリデーションを追加
- 日本語名・カナ名・生年月日・パスワード形式などをチェック

---

## 4. 新規登録・ログイン画面のカスタマイズ

**ファイル:**  
- `app/views/devise/registrations/new.html.erb`  
- `app/views/devise/sessions/new.html.erb`

**ポイント:**  
- フォーム項目を追加・日本語化
- `f.text_field :nickname` など、Userモデルの属性に合わせてフォームを編集

---

## 5. 日本語化（エラーメッセージ・属性名）

**ファイル:** ja.yml

```yaml
ja:
  activerecord:
    attributes:
      user:
        nickname: "ニックネーム"
        email: "メールアドレス"
        password: "パスワード"
        last_name: "姓"
        first_name: "名"
        last_kana: "姓（カタカナ）"
        first_kana: "名（カタカナ）"
        birthday: "生年月日"
  errors:
    format: "%{attribute} %{message}"
    messages:
      blank: "を入力してください"
      # ...他
```

**解説:**  
- 属性名を日本語化し、バリデーションエラーも日本語で表示
- deviseのエラーメッセージも`devise.ja.yml`で日本語化可能

---

## 6. RSpecによるモデルテスト

**ファイル:** `spec/models/user_spec.rb`

```ruby
RSpec.describe User, type: :model do
  before { @user = FactoryBot.build(:user) }

  context '登録できる場合' do
    it '全ての項目が正しく入力されていれば登録できる' do
      expect(@user).to be_valid
    end
    # ...正常系
  end

  context '登録できない場合' do
    it 'ニックネームが空では登録できない' do
      @user.nickname = ''
      @user.valid?
      expect(@user.errors.full_messages).to include("ニックネーム を入力してください")
    end
    # ...異常系（メール重複、パスワード形式、名前形式など）
  end
end
```

**解説:**  
- FactoryBotでテスト用ユーザーを生成
- 正常系・異常系をcontextで分けてテスト
- エラーメッセージは日本語・属性名付きで検証

---

## 7. コントローラー・ルーティング

**ファイル:**  
- `config/routes.rb`  
  ```ruby
  devise_for :users
  ```
- `app/controllers/application_controller.rb`  
  ```ruby
  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :last_name, :first_name, :last_kana, :first_kana, :birthday])
  end
  ```

**解説:**  
- deviseのルーティング・ストロングパラメータ拡張
- 新規登録時に追加項目も保存できるようにする

---

## 8. 動作確認

- 新規登録・ログイン・ログアウトが正常に動作するか確認
- バリデーション・エラーメッセージが日本語で表示されるか確認
- RSpecテストがすべてパスすることを確認

---

## まとめ
- deviseでユーザー管理機能を簡単・安全に実装
- RSpecでテストも忘れずに実施
-