【Rails】ツイート投稿アプリの再実装から学んだ基礎知識まとめ

# 【Rails】ツイート投稿アプリの再実装から学んだ基礎知識まとめ

本日は、Railsでツイート投稿アプリの再実装を行いながら、様々な重要概念に触れました。初学者の自分自身が理解を深めるためにも、学んだことを噛み砕いてアウトプットします。

## ✅ カラム型とは？
カラム型は、データベースの各カラムに格納されるデータの種類を示します。代表的な型には以下があります：
| データ型     | 説明           |   |
| -------- | ------------ | - |
| string   | 文字列（255文字まで） |   |
| text     | 長い文字列        |   |
| integer  | 整数           |   |
| boolean  | 真偽値          |   |
| datetime | 日時           |   |


## ✅ インスタンス変数をeachで扱うとは？
```
<% @tweets.each do |tweet| %>
```
これは、@tweets（全ツイートの配列）を1つずつ取り出し、tweetという名前で処理する、という意味です。ブロック内では、1つ1つのtweetに対してビューを表示できます。
```
<%= tweet.image %>
```
これは、tweetという1つのレコードから、imageカラムのデータを取り出して表示していることになります。

## ✅ root to: とは？
```
root to: 'tweets#index'
```
これは、「アプリを開いたときの最初のページ（ルートパス）をどのアクションにするか」を指定するものです。

## アクションと変数名の規則性
Railsでは、アクション名に応じたインスタンス変数の使い方にある程度の「慣習」があります。
| アクション名    | 意味       | よく使うインスタンス変数名                    |
| --------- | -------- | -------------------------------- |
| `index`   | 一覧表示     | `@users`, `@tweets`（複数形）         |
| `show`    | 1件表示     | `@user`, `@tweet`（単数形）           |
| `new`     | 新規作成フォーム | `@user = User.new`               |
| `create`  | 作成処理     | `@user = User.new(user_params)`  |
| `edit`    | 編集フォーム   | `@user = User.find(params[:id])` |
| `update`  | 更新処理     | `@user = User.find(...)`         |
| `destroy` | 削除処理     | `@user = User.find(...)`         |

@をつけると、ビュー（HTMLを表示する部分）でも使えるようになります。

・アクション名 → 処理の意図（index → 一覧, show → 詳細…）

・インスタンス変数 → ビューで使いたい情報（@user, @tweets）

・モデル名 → データベースとつながる「型」（User, Tweet）

・複数データを扱うなら複数形、1つだけなら単数形の変数名が慣習

### ✅ 例：Tweet（ツイート）アプリの場合
🔹 index アクション（一覧表示）
```
def index
  @tweets = Tweet.all  # 全てのツイートを取得してビューに渡す
end
```
・モデル名：Tweet（クラス）
・インスタンス変数：@tweets（Tweetの複数のデータ）(indexのビューで使用するデータ)
・理由：ビューで「全ツイートを一覧で表示」するため複数形

🔹 show アクション（1件表示）
```
def show
  @tweet = Tweet.find(params[:id])
end
```
・モデル名：Tweet
・インスタンス変数：@tweet（Tweetの1件）
・理由：「特定のツイート1件」を表示するので単数形

### ✅ なぜ @ をつけるの？
@ をつけないと、ビューでその変数が使えないからです。

🔹例（ビューに渡らない）
```
def show
  tweet = Tweet.find(params[:id])  # ローカル変数。ビューでは使えない
end
```
### ✅アクション内でインスタンス変数を定義しない場合
Railsではインスタンス変数（@付き）を定義しない場合、ビューに値が渡らないという制約がありますが、「そもそもビューに渡す必要がない場合」にはインスタンス変数を使わないこともあります。

🔹例：redirect_toをつかう場合
```
def destroy
  tweet = Tweet.find(params[:id])
  tweet.destroy
  redirect_to tweets_path, notice: 'ツイートを削除しました'
end
```
・tweet はローカル変数（@なし）
・ビューには渡さない（この後 index へリダイレクトする）
・よって、@tweet のようなインスタンス変数にする必要がない

### ✅ 要点まとめ
| 状況                  | インスタンス変数は必要？  |
| ------------------- | ------------- |
| ビュー（HTML）で使いたい場合    | 必要（`@変数名`）    |
| リダイレクトやセッション操作だけの場合(アクション内の処理だけで完結する場合) | 不要（ローカル変数でOK） |


## ✅ .newや.allの意味
```
@tweet = Tweet.new
@tweets = Tweet.all
```
.new → Tweetモデルから「新しい空のインスタンス」を生成

.all → Tweetモデルから「全レコード」を取得

## ✅ form_withの解説
```
<%= form_with(model: @tweet, local: true) do |form| %>
```
```
<%= form.text_field :name, placeholder: "Nickname" %>
```
## ✅ createアクションと保存の流れ
```
def create
  Tweet.create(tweet_params)
  redirect_to "/"
end
```
## ✅ 削除リンクの仕組みとturbo_method
```
<%= link_to '削除', "/tweets/#{tweet.id}", data: { turbo_method: :delete } %>
```
これは、「link_toで作成したリンクをDELETEメソッドとして扱う」ためのコードです。

Railsでは、リンクは通常GETメソッドですが、データ削除にはDELETEメソッドを使う必要があるため、data: { turbo_method: :delete }を付けます。

## ✅ モデルとインスタンスの使い分け（newとupdateの違い）
```
Tweet.create # モデルクラスを直接使う（新規保存）
tweet.update # インスタンスに対して更新する
```
新規投稿 → Tweet.newでモデルから新規インスタンスを生成して保存

編集保存 → 既存インスタンスに対してupdate

## ✅ link_toとprefix、HTTPメソッド
```
<%= link_to '削除', tweet_path(tweet), method: :delete %>
```
weet_path(tweet)：プレフィックス（URLのエイリアス）

method: :delete：HTTPメソッドを指定

GET以外のメソッド（POST、DELETEなど）は、リンクだけでは動かせないため、method: :deleteを使って明示します。

## ✅ その他補足ワードまとめ
| 用語                           | 解説                                           |
| ---------------------------- | -------------------------------------------- |
| prefix                       | `rake routes`で出てくるURLのショートカット名。ビューでも使いやすくなる。 |
| `rails g devise:install`     | Deviseの初期設定コマンド                              |
| `rails g devise user`        | UserモデルにDevise機能を追加                          |
| `rails g devise:views`       | Devise用のビューを自動生成                             |
| `devise_parameter_sanitizer` | Deviseで許可するパラメータを指定                          |
| `user_signed_in?`            | ログイン中かどうかを判定                                 |
| `unless`                     | 条件がfalseのときだけ実行する（ifの逆）                      |

## ✍️ 感想
Railsを使っての再実装では、コーディングの手順よりも、なぜこのような書き方になるのかを意識して理解することが重要だと感じました。特に、アクションごとの変数の扱いや、ルーティングとHTTPメソッドの関係は、実際に手を動かすとしっかり理解できると感じました！