Rails 基本①　 設計哲学〜ディレクトリ構成

# 1. 概要

- railsのディレクトリ構成や基本的なところから知りたかった
- railsのディレクトリ構成、railsコマンド、コントローラーやモデルについて調べたことをまとめた

### 参考資料：[Railsの基礎知識](https://railsdoc.com/rails_base)

# 2. 設計哲学

- 設定より規約【Conversion over Configuration(CoC)】[^1]

慣例に従わない時にのみそれに沿ったコードを書く必要があるということ
テーブルのマイグレーションファイルを作成するときなども命名規則が決まっており、これの通りに作成することでRailsがうまく処理してくれるので、基本的には規約に沿えばいい

- 同じ作業を繰り返さない【Don't Repeat Yourself(DRY)】[^2]

# 3. ディレクトリ構成

デフォルトのディレクトリからAPIモードに必要ないディレクトリ等は端折っている
参考：[ディレクトリ構成](https://site-builder.wiki/posts/14484)

/
├ /app			アプリケーション用のファイルを置く
│ ├ /assets		アプリケーション自身が保有するソースファイルを置く
│ │   ├ /config	アセットのマニフェストを置く
│ │   └ /images	画像を置く
│ ├ /controllers	コントローラー
│ ├ /jobs		ジョブを置く
│ ├ /lib		ヘルパー以外で自動読み込みするアプリケーション用のモジュールを置く
│ ├ /mailers		メーラーを置く
│ └ /models		モデルを置く
├ /bin			Railsが生成するプロジェクト用のコマンドを置く
├ /bundle_bin		Bundlerのスタブを置く
├ /scripts		プロジェクトで使用するシェルスクリプトを置く
├ /build		タスクの生成物を置く
├ /config		設定ファイルを置く
├ /db			データベース関連のファイルを置く
├ /lib			自動読込しないアプリケーション用のモジュールを置く
├ /share		ライブラリのモジュールを置く
├ /test		テスト用のファイルを置く　RSpecを使用するなら使用しないディレクトリ？
├ /log			ログファイルを置く
├ /tmp			一時ファイルを置く
├ /vendor		サードパーティーのファイルを置く
│ ├ /assets		サードパーティーのアセット
│ ├ /bundle		`Bundler`が`gem`をインストールする場所
│ └ /patches		`gem`用のパッチ
├ /plugins		プロジェクト内で使用するRailsプラグイン
├ /node_modules	npmパッケージをインストールする場所
└ /patches		`patch-pachage`用のパッチを置く

以下ディレクトリの説明の追加

## 3.1. /app

アプリケーション用のファイルを置く
サブディレクトリもある

### 3.1.1. /app/assets

アプリケーション自身が保有するソースファイルを置く
ここ以外にも/assetsファイルがあるが、それとの違いは

- lib/assets

> 1つのアプリケーションの範疇に収まらないライブラリのコードや、複数のアプリケーションで共有されるライブラリのコードを置く場所[^3]

- vendor/assets

> JavaScriptプラグインやCSSフレームワークなど、外部の団体などによって所有されているアセットの置き場所[^3]

参考：[Rails5 app/assets、lib/asses、vendor/assetsの使い分け](https://blog.tanebox.com/archives/22/)

また、assetsのサブディレクトリもある

#### 3.1.1.1. /app/assets/config

プリコンパイルするアセットを指定するための`manifest.js`を置く

#### 3.1.1.2. /app/assets/images

画像を置くディレクトリ
`.keep`という空のファイルがある
Gitが空のディレクトリをバージョン管理の管理下に置かない特性からこのファイルが存在する

### 3.1.2. /app/controllers

コントローラーを置くディレクトリ
サブディレクトリもある

#### 3.1.2.1. /app/controllers/concerns

複数のコントローラーで使用する共通のメソッドを記述するファイルを置く
複数のコントローラーで使用されるメソッドをそれぞれで書いていると冗長なので、ここにまとめることがある

### 3.1.3. /app/models

モデルを置くディレクトリ
サブディレクトリもある

#### 3.1.3.1. concerns

複数のモデルで使用する共通のメソッドを記述するファイルを置く
複数のモデルで使用されるメソッドをそれぞれで書いていると冗長なので、ここにまとめることがある

## 3.2. /bin

Railsプロジェクト毎に用意されているスクリプトを実行するためのファイルが置かれる
`rails/command`に定義されているバイナリを実行するためのエイリアスもこのファイルに登録されていたりする
参考：[Railsファイル辞典(binディレクトリ編)](https://bibibiroomer.com/?p=877)

## 3.3. /scripts

`Rails runner`とかを使ってゴニョニョするために使うっぽい(今のところ使わなそうなのでその時になって調べる)
[この辺を後で読んでみる](https://yu0105teshi.hateblo.jp/entry/2016/03/24/122011)

## 3.4. /config

様々な設定ファイルを置く
詳細は以下

https://qiita.com/Islanders-Treasure0969/items/7058f6fb715eaf23c9f9

## 3.5. /db

開発環境とテスト環境のデータベースファイルが作成されるディレクトリ
また、シードデータ投入用のファイルもここに作成される


## 別記事で以下で調べた内容をまとめる予定

# 4. railsコマンドについて

https://www.makotoarai.com/rails-command/

# 5. コントローラー

https://railsdoc.com/controller

# 6. モデル

https://railsdoc.com/model





[^1]: 開発者の決定すべきことを減少させ、単純にするが柔軟性は失わせないソフトウェア設計パラダイムのこと 参考：[Wikipedia/設定より規約](https://ja.wikipedia.org/wiki/%E8%A8%AD%E5%AE%9A%E3%82%88%E3%82%8A%E8%A6%8F%E7%B4%84)
[^2]: 重複を防ぐ考え方。追求しすぎると疎結合の原則が破られることがままあるので兼ね合いを見ることが必要 参考：[Wikipedia/DRY](https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself)
[^3]: [Railsガイド](https://railsguides.jp/asset_pipeline.html)からの引用