Railsで開発時によく使うコマンドまとめ

今回は、Rails開発中によく使うコマンドをまとめてみました。新しくRails案件を立ち上げる方や、コマンドの使い方初心者の参考になれば幸いです。

# 一、Rails アプリ

## 1. プロジェクトの作成

```bash
# 基本的な作成
rails new myapp

# APIモードで作成
rails new myapp --api

# データベースを指定して作成
rails new myapp -d postgresql

# Docker開発環境
rails new backend -r 8.0.0 --devcontainer -d mysql --api --skip-kamal
```

#### Docker開発環境のパラメータ説明

- `backend`: プロジェクト名
- `-r 8.0.0`: Railsのバージョンを8.0.0に指定
- `--devcontainer`: VS Code用のdev container設定を追加（Docker開発環境用）
- `-d mysql`: データベースにMySQLを使用
- `--api`: APIモード（フロントエンド用のビューファイルなどを作成しない）
- `--skip-kamal`: Kamal（デプロイツール）の設定をスキップ

https://guides.rubyonrails.org/command_line.html

## 2. devise_token_authのインストール

```bash
rails g devise_token_auth:install User auth
```

#### パラメータ説明

- `User`: 認証用のモデル名（この場合は`User`モデルを作成）
- `auth`: URLのパスに使用される。例：`/auth/sign_in`

#### よく使用される認証エンドポイント

このセットアップにより、以下のエンドポイントが自動的に生成されます：

- サインアップ: `POST /auth`
- サインイン: `POST /auth/sign_in`
- サインアウト: `DELETE /auth/sign_out`
- パスワード変更: `PUT /auth/password`
- アカウント更新: `PUT /auth`

https://qiita.com/Hashimoto-Noriaki/items/585bb58b80cf696e6697

## 3. サーバーの起動
```bash
# サーバーを起動
rails server

# サーバーを起動の省略形
rails s

# ポートを指定して起動
rails s -p 3001

# バインドするIPアドレスを指定
rails s -b 0.0.0.0
```

## 4. コンソール操作

```bash
# Railsコンソールを起動
rails console

# 省略形
rails c
```

## 5. ルーティング確認

```bash
# 一覧の確認
rails routes

# APIのルートを確認
rails routes | grep api

# Railsのルーティング一覧から "auth" という文字列を含むルートだけを抽出して表示する
# 特に `devise_token_auth` を使用している場合、このコマンドは非常に便利です
rails routes | grep auth
```

#### 説明
- `|` は「パイプ」と呼ばれ、左のコマンドの出力を右のコマンドの入力として渡します。

- `grep` は「全体から (Global)正規表現 (Regular Expression) に一致する行を表示(Print)する」というその名の由来のとおり、文字列を複数ファイルから検索するコマンドです。


# 二、モデル・データベース関連

## 1. モデルの作成
https://railsdoc.com/page/rails_generate_model

## 2. マイグレーション
```bash
# マイグレーションの実行
rails db:migrate

# 一つ前の状態に戻す
rails db:rollback

# DBの削除 → 作成 → 初期データ投入
rails db:reset

# DBを作成
rails db:create

# DBを削除
rails db:drop
```

### DBに初期データを投入
```bash
rails db:seed
```
#### 注意

1. **リセットの`rails db:reset`は、開発環境のみ使用してください！**
2. `rails db:reset`や`rails db:drop`などの破壊するコマンドの実行前に、必ず正しい環境（development/test）で実行しているか確認しましょう
2. `rails generate`コマンドで作成したファイルは、`rails destroy`で削除できます

## 3. コントローラーの作成

例えば：
```bash
# namespace付き、かつ、アクションを指定
rails generate controller api/client/media create

# 省略形
rails g controller api/client/media create
```

このコマンドを実行すると、以下のファイルが生成されます：

```
app/controllers/api/client/media_controller.rb
```

そして、`routes.rb`には以下のようなnamespace付きのルーティングを追加します：

```ruby
Rails.application.routes.draw do
  namespace :api do
    namespace :client do
      # ※POSTしたいなら、手動で編集してください
      # post "media", to: "media#create"
      get "media/create"
    end
  end
end
```

実際のコントローラーの中身は以下のようになります：

```ruby
module Api
  module Client
    class MediaController < ApplicationController
      def create
      end
    end
  end
end
```

案件によるけど、バージョン管理（v1, v2など）は最初から導入しておくと後が楽

```ruby
# APIバージョン管理用
rails g controller api/v1/users
rails g controller api/v2/users
```

# 三、Rails ConsoleでのDBのCRUD

まずはRailsコンソールを起動

```bash
rails c
```

## 1. データの作成（Create）

```ruby
# 方法1: newとsave
user = User.new(email: "tanaka@example.com", password: "tanakapassword")
user.save

# 方法2: create（一行で作成）
user = User.create(name: "山田花子", email: "yamada@example.com")

# 方法3: create!（エラー時に例外を発生）
user = User.create!(name: "佐藤次郎", email: "sato@example.com")

# 複数のレコードを一度に作成
users = User.create([
  { name: "User1", email: "user1@example.com" },
  { name: "User2", email: "user2@example.com" }
])
```

## 2. データの検索（Read）


```ruby
# 特定のテーブル一覧
User.page

# 最初と最後
User.first
User.last

# 並び順
User.order(created_at: :desc)

# 並び順（複数）
User.order(email: :asc, name: :desc)

# 件数制限
User.limit(5)
```

### findを使った検索

```ruby
# IDを絞って検索
User.find(1)
User.find_by(id: 1)  # 見つからない場合はnil

# 条件を絞って検索
User.find_by(email: "tanaka@example.com")
User.find_by!(email: "tanaka@example.com")  # 見つからない場合は例外

# 複数の条件を絞って検索
User.find_by(name: "山田花子", email: "tanaka@example.com")
```

### whereを使った検索
```ruby
# 複数のレコードを取得
users = User.where(active: true)
users = User.where("age >= ?", 20)

# OR条件
users = User.where("age = ? OR age = ?", 20, 30)
users = User.where(age: [20, 30])

# AND条件
users = User.where(age: 20).where(active: true)
```

### 集計
```ruby
# レコード数のカウント
User.count
```

## 3. データの更新（Update）

### 単一レコードの更新
```ruby
# 方法1: 属性を変更してsave
user = User.find(1)
user.name = "新しい名前"
user.save

# 方法2: update
user = User.find(1)
user.update(name: "新しい名前", email: "new@example.com")

# 方法3: update!（エラー時に例外を発生）
user.update!(name: "新しい名前")
```

### 複数レコードの一括更新
```ruby
# 条件に合うレコードを全て更新
User.where(active: false).update_all(active: true)

# 特定の値を増減
User.where(active: true).update_all("points = points + 10")
```

## 4. データの削除（Delete）

### 単一レコードの削除
```ruby
user = User.find(1)

# 方法1: destroy（コールバックが実行される）
user.destroy
# 方法2: delete（コールバックが実行されない）
user.delete
```

### 複数レコードの削除
```ruby
# 条件に合うレコードを全て削除
User.where(active: false).destroy_all  # コールバックあり
User.where(active: false).delete_all   # コールバックなし

# 全レコード削除
User.destroy_all
```

## 5. その他

```ruby
# レコードの存在確認
User.exists?(id: 1)
User.where(age: 20).exists?

# 条件に一致するレコードを探すか作成
user = User.find_or_create_by(email: "test@example.com")
```

# 四、Bundlerでよく使うコマンド

## 1. 基本的な使い方

bundlerは、「gemの依存関係とバージョンを管理するためのツール」です。

### インストール
```bash
bundle install
```

### アップデート
```bash
# 全てのgemをアップデート
bundle update

# 特定のgemだけアップデート
bundle update rails

# 複数のgemをアップデート
bundle update rails devise
```

### Bundlerで管理されているコマンドを実行
```bash
bundle exec rspec
```

https://qiita.com/d0ne1s/items/fa2dafcee02e963fe997

## 2. Gemfile操作

### 新しいGemfileを作成
```bash
bundle init
```

### Gemfileに新しいgemを追加してインストール
```bash
bundle add devise
bundle add rspec-rails --group development,test
```

### 特定のgemを削除
```bash
bundle remove devise
```

## 3. 確認

### インストールされているgemの一覧表示
```bash
bundle list

# 特定のgemの情報を表示
bundle list | grep rails
```

### 特定のgemの詳細情報を表示
```bash
bundle info rails
bundle info devise
```

### 必要なgemが全てインストールされているか確認
```bash
bundle check
```

### 使用していないgemを削除
```bash
bundle clean

# 強制的に削除
bundle clean --force
```


### 注意

1. `bundle install` vs `bundle update`
   - `install`: Gemfile.lockの内容を元にインストール
   - `update`: 最新バージョンに更新してGemfile.lockを書き換え


2. 環境ごとの管理
   ```ruby
   # Gemfileでの書き方
   group :development, :test do
     gem 'rspec-rails'
   end
   ```




# まとめ

この記事を手元に置いておくと、開発作業がスムーズに進めます。