📝 【Rails】初学者の学習記録（2025年4月29日）

# 📝 Rails初学者の学習記録（2025年4月29日）

こんにちは！今日は、Railsアプリケーション開発において重要な概念や技術について学習しました。以下に、学んだ内容を整理して記録します。

---

## ✅ バリデーション

モデルに対してデータの整合性を保つための制約を設けることができます。例えば、`presence: true`を使用すると、指定した属性が空でないことを検証します。

```ruby
class User < ApplicationRecord
  validates :name, presence: true
end
```

## 👤 current_userメソッド
Deviseなどの認証システムを使用すると、current_userメソッドで現在ログインしているユーザーの情報を取得できます。
```
<% if user_signed_in? %>
  <p>こんにちは、<%= current_user.name %>さん</p>
<% end %>
```

## 🔀 mergeメソッド
ハッシュを結合する際に使用します。例えば、ストロングパラメータで追加の情報を付加する場合に便利です。
```
params.require(:post).permit(:title, :content).merge(user_id: current_user.id)
```

## 📊 orderメソッド
データの並び順を指定する際に使用します。例えば、作成日時の降順で並べる場合は以下のように記述します。
```
@posts = Post.order(created_at: :desc)
```

## 🧩 部分テンプレートとrenderメソッド
ビューの共通部分を部分テンプレートとして切り出し、renderメソッドで挿入することで、コードの再利用性が向上します。
```
<%= render 'shared/header' %>
```
オプションを渡すことで、部分テンプレート内で変数を使用することも可能です。
```
<%= render 'shared/post', post: @post %>
```
## 📐 テーブル図とリレーション図
__テーブル図:__  データベースの各テーブルとそのカラムを視覚的に表現した図。

__リレーション図:__  テーブル間の関連性（リレーション）を示す図。has_manyやbelongs_toなどの関係性を視覚化します。

## 🧭 ルーティングのネストとcollection・member
ルーティングをネストすることで、関連するリソースのURL構造を整理できます。
```
resources :posts do
  collection do
    get 'search'
  end

  member do
    get 'preview'
  end
end
```
__collection:__ リソース全体に対するアクション（例: /posts/search）

__member:__ 特定のリソースに対するアクション（例: /posts/:id/preview）

## 🔍 whereメソッドとLIKE検索
whereメソッドを使用して、条件に合致するレコードを取得できます。
```
@posts = Post.where(published: true)
```
LIKEを使用した部分一致検索も可能です。
```
@posts = Post.where('title LIKE ?', "%#{params[:keyword]}%")
```

## 🛠️ Railsエラー画面とデバッグ
__エラー画面:__ エラーの種類や発生箇所、スタックトレースなどが表示され、問題の特定に役立ちます。

__デバッグ:__ pry-railsを使用すると、binding.pryで処理を一時停止し、変数の中身を確認できます。
```
def show
  @post = Post.find(params[:id])
  binding.pry
end
```

## 🛠️ Webアプリ開発の流れ

Webアプリケーションを開発する際の一般的なフローは以下の通りです。

### 1. 企画・要件定義

- **ペルソナの設定**: 想定するユーザー像を具体的に描きます。
- **ユーザーストーリーの作成**: ユーザーがどのようにアプリを利用するかのシナリオを考えます。
- **要件定義**: アプリに必要な機能や仕様を明確にします。

### 2. 設計

- **基本設計**: 画面構成や機能の概要を設計します。
- **詳細設計**: 各機能の具体的な処理やデータの流れを設計します。
- **画面遷移図の作成**: ユーザーがどのように画面を移動するかを図示します。
- **DB設計**:
  - **エンティティの洗い出し**: 必要なデータの種類を特定します。
  - **モデリング**: データの関係性を整理します。
  - **正規化**: データの重複を排除し、効率的な構造にします。
  - **制約の設定**:
    - **NOT NULL制約**: 必須項目を設定します。
    - **一意性制約**: 重複を許さない項目を設定します。
    - **主キー制約**: 各レコードを一意に識別するキーを設定します。
    - **外部キー制約**: 他のテーブルとの関係性を設定します。
    - **チェック制約**: 特定の条件を満たす値のみを許可します。
- **ER図の作成**: テーブル間の関係性を視覚的に表現します。

### 3. 実装

- **バリデーションの設定**: 入力データの検証を行います。
- **`current_user`メソッドの利用**: ログインユーザーの情報を取得します。
- **`merge`メソッドの活用**: パラメータの統合を行います。
- **`order`メソッドの使用**: データの並び替えを行います。
- **部分テンプレートと`render`メソッドの活用**: ビューの共通部分を再利用します。
- **ルーティングのネスト**:
  - **`collection`**: 全体に対するアクションを定義します。
  - **`member`**: 個別のリソースに対するアクションを定義します。
- **`where`メソッドと`like`の使用**: 条件に合致するデータの取得を行います。

### 4. デバッグ・テスト

- **Railsエラー画面の確認**: エラーの内容を把握し、修正します。
- **SyntaxErrorの確認**: 文法エラーを特定し、修正します。
- **デバッグの実施**: 問題の原因を特定し、解決します。
- **`pry-rails`と`binding.pry`の使用**: 実行中のコードの状態を確認します。

### 5. バージョン管理

- **GitとGitHubの利用**:
  - **Git**: ローカルでのバージョン管理を行います。
  - **GitHub**: リモートでのコード共有や共同開発を行います。

---

## 🧰 GitとGitHubの違いとそれぞれのメリット
__Git:__  バージョン管理システム。ローカルでのソースコードの変更履歴を管理できます。

__GitHub:__ Gitリポジトリをホスティングするサービス。リモートでの共同開発やコードレビュー、Issue管理などが可能です。

メリット:
```
Git:

オフラインでの作業が可能。

ローカルでの履歴管理により、変更の追跡や復元が容易。
```
```
GitHub:

複数人での共同開発が容易。

プルリクエストやIssueを通じた効率的な開発フロー。

オープンソースプロジェクトへの参加が容易。
```


## 🧠 学んだことのまとめ

- Webアプリ開発は、企画から設計、実装、テスト、運用までの一連の流れを理解することが重要です。
- 各工程でのポイントや使用する技術・ツールを把握することで、効率的な開発が可能になります。
- 特に、設計段階でのDB設計や画面遷移図の作成は、後の実装をスムーズに進めるために欠かせません。

これらの知識を活かして、今後の開発に取り組んでいきたいと思います。