【Ruby on Rails】初学者向け－開発の流れについて①　プロジェクトの作成編

## Rails開発の流れについて

本記事では下記の流れに沿って簡易的なタスク管理アプリを作成してみようと思います。

**・Railsプロジェクトの作成とDockerの設定（今回学習するのはこちら）**
・Gem・DB設定とルーティング
・Bootstrapの導入
・一覧、新規作成、参照、更新、削除画面機能の追加
・検索機能の追加
・DBやモデル周りの整備
・バリデーション機能追加
・ユーザー認証機能追加

（※ 他追加機能があれば随時記事にしていく予定です）

まずざっくり前提とした環境としては以下です。
・Docker
・Ruby on Rails 7
・Mysql
・BootStrap
・VSCode

本記事では上記環境構築が既に行われている前提で
Railsプロジェクトの作成とDockerの設定から進めていきます。

----------------------------------------------------------------------------------
### 〇 Railsプロジェクトの作成とDockerの設定

まずアプリを作成するにあたって、根幹となるファイルを作成します。
Railsは大変便利なのでコマンドを打つとすぐに必要なファイルを作成してくれます。

最初にターミナルを開き、railsのアプリケーションファイルを作成したいディレクトリまで移動します。

```ruby:terminal
cd C:\programs2024
```

programs2024で下記コマンドを実行する。
```ruby:terminal
# railsのコンテナを起動してrailsアプリのベースとなるファイルを作成する
# 入力例
C:\programs2024> docker run --rm -ti -v "$(pwd)\task-practice:/app" ruby:3.2.2-alpine sh
```

**「docker run」**
...特定のDockerイメージからコンテナを起動させるという意味

**「--rm」**
...コンテナを終了したときにコンテナを自動で削除するというオプション

**「-ti」**
...コンテナでシェルを立ち上げた際に、シェルでコマンドを実行や、
　コマンドの実行結果を画面に表示するため必要なオプション
 
**「-v "$(pwd)\task-practice:/app"」**
...PC上のtask-practiceディレクトリを、コンテナの/appディレクトリにマウントする指定。
　PC上からコンテナで作成したファイル等を直接見ることができるようにするもの。

**「ruby:3.2.2-alpine」**
...イメージ名（今回使用するrubyのバージョン）

**「sh」**
...コンテナ内で実行するコマンドの指定（今回はシェルを用いる）


入力箇所が下記のように変化するのを確認する
```ruby:terminal
/# 
```

-----------------------------------------------------

下記のコマンドを順番に打っていく
```ruby:terminal
# システムのパッケージリストを最新の状態に更新するためのコマンド
apk update

# gitと、mysqlを使用するシステムを開発するのに必要なmysql-devをインストールする 
apk add git g++ make mysql-dev

# RubyのパッケージシステムであるRubGemを最新バージョンに更新するためのコマンド
gem update --system

# railsのアプリケーションを作成するコマンド
rails new app --database=mysql --skip-bundle --skip-test

```

**apk**
…Alpine Linuxで使用されるパッケージマネージャーAlpine Package Keeperの意

**g++**
…C++コンパイラのこと。C++プログラムをコンパイラするのに使用する

**--system**
…gem updateコマンドに対して、RubyGemsパッケージマネージャ自体を更新するために使用するオプション

**--database=<データベース名>**
...作成する新しいアプリケーションで使用するデータベースの種類を指定するオプション

**--skip-<処理名・ファイル名等>**
...アプリケーション作成時に、「-」後に指定した処理やファイルの作成を行わないようにするオプション
「--skip-bundle」は新しいアプリケーション作成時にbundle installを行わずにスキップすることを意味する


-----------------------------------------------------
最後のコマンドまで問題なく実行できたら、ファイルが作成されているか確認する
```ruby:terminal
/# 
ls -la /app
```

------------------------------------------------------
ここまででまずRailsのベースとなるファイルの作成が一通り終わりました。

VSCodeで作成したRailsアプリケーションのフォルダー（ここではtask-practice）を開き、
次にDockerの設定ファイル（Dockerfileとdocker-compose.yml）をapp直下に作成します。

**Dockerfile**
docker compose buildというコマンドを打って環境を更新（個人的な認知としてはリフレッシュに近い）する際に行いたい処理を記載するファイル

```Dockerfile:Dockerfile
# 記載例
FROM ruby:3.2.2-alpine

RUN apk update

RUN apk add g++ make mysql-dev tzdata

WORKDIR /app

COPY Gemfile .

RUN bundle install
```
------------------------------------------------------
**docker-compose.yml**
…開発環境を立ち上げるために必要なファイル
　これを記入し、ようやくdocker compose upでコンテナの立ち上げを行うことができる
 　（DBのimage等は使用するDBによって変化するので任意の項目となる）
  
```yml:docker-compose.yml
# 記載例
services:
  web:
    build: .
    command: sh -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db
  db:
    image: mysql:8.0
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
volumes:
    db-volume:
```

Railsのベースとなるファイル作成とDockerの設定が完了したので、
次の記事ではRailsで開発を行う上で重要なルーティングについてまとめていきたいと思います。