【初心者向け】「rails new」で生成されるフォルダ、ファイルをざっくり解説してみた。

# はじめに

この記事はDMM WEBCAMP アドベントカレンダー2日目の記事です。

こんにちは。DMM WEBCAMPのメンターをしてます。このアドベントカレンダーのいいだしっぺです。

今回は、Railsを触る上で外せない`rails new`コマンドで生成されるフォルダ、ファイルについて、解説していきたいと思います。 

また、Rails5と6のファイル構成の違いも軽く触れてあります。

## 対象者
- Rails触りたての方、触ったことのない方。
- Railsを使ってるけど、具体的にこのフォルダで何ができるのかイマイチな方。
- 他言語のMVCフレームワークを触っていて、Railsを理解したい方。

## 環境

macOS Catalina 10.15.1
Rails: 6.0.1
Ruby: 2.6.5

# そもそもrails newとは

`rails new`コマンドは、Railsを使う上で必要不可欠なファイルを一度に作成してくれるコマンドです。
むしろこれを打たないと始まんないじゃないかってぐらい大事なコマンドです。
実行したらたくさんのファイルを生成したあと、デフォルトのGemfileに記載されているgem [^1] のinstallが始まります。(Gemfileについては後述)
また、Rails6だとその後webpacker [^2] のインストール(`rails webpacker:install`)が実行されます。

# 生成されるフォルダ/ファイルの解説

ここからは`rails new`を叩いたら、生成されるフォルダ、ファイルの解説をしていきます。
主要なものだけざっくり解説するのでもっと細かい説明は[Railsガイド](https://railsguides.jp/)を参照してください。


## /app

MVC関連やjs、cssを格納するフォルダなど、Railsの中枢に関わるフォルダ。
rails5だとassetsの中に/javascriptsファイルが入っていたが、rails6だとappの中に入っている。

### /assets
/images(画像)や/stylesheets(CSS)など、ページを装飾するものをまとめたフォルダ。

### /controller
MVCのCの部分。人間で言うところの「脳」であるコントローラーをまとめたフォルダ。
`rails g controller hoges`のコマンドを叩くと、このフォルダに`hoges_controller.rb`が作成される。

### /helper
helperとは、主にviewをシンプルにするために、ちょっとした処理をやりたいときに使うメソッド[^3]。
それらを書くファイルをまとめたフォルダ。
コントローラーが作られると同時にコントローラー名の名前のファイルが作成される。

### /models
MVCのMの部分。Railsでは主にデータベースとのやりとりや制約などを記述するモデルをまとめたフォルダ。
使用しているデータベースのテーブル毎にモデルが用意される。
`rails g model Hoge`のコマンドを叩くと、このフォルダに`Hoge.rb`が作成される。

### /views
MVCのVの部分。ページの見た目を作るためのERBファイルをまとめたフォルダ。
コントローラーが作られると同時にコントローラー名の名前のフォルダが作成される。
`rails g controller hoges index` とコマンドを打てば該当のファイルに`index.html.erb`が作成される。

## /bin
サーバを起動したり、テストをしたり、アプリケーションを管理する様々なスクリプトファイルをまとめるフォルダ。[^4]
各プロジェクトのRailsのバージョンが違っていた場合、`bin/rails s`と/binを指定してコマンド実行するとそのバージョンでのコマンドで実行されるのでおすすめ。

## /config
RailsやルーティングやDBなど、Railsの様々な設定ファイルをまとめてあるフォルダ。
Rails6ではwebpack関連の設定ファイルもある。

### database.yml
データベース設定ファイル。YAML[^5]というデータ形式で書かれている。
開発、テスト、本番環境別のDBサーバやパスワード等を記述する。

### routes.rb
取得したURLを適切なコントローラー内のアクションなどに割り当てるためのルーティングファイル。
**`Routing Error`の原因はだいたいここ。**
`rails routes`で割り当てているルーティングの一覧が見れる。
`resource`がとっても便利。(RESTfulなリソースにしてくれる。)[^6]

## /db
データベース関連の情報をまとめたフォルダ。
デフォルトだと`seeds.rb`しかない。

### /migrate
モデル作成時や`rails g migration hogehoge`でマイグレーションファイルがこのファイルの直下に作成される。
`rails db:migrate`を実行すると生成したテーブルやカラムなどがマイグレーションファイルを参考にデータベースへ内容が保存される。

### schema.rb
`rails db:migrate`実行後に生成される、実行結果（実際にデータベースに保存されているテーブル等）が反映されているファイル。
デフォルトだとここを弄ってもテーブルの内容はかわらない。

### seeds.rb
既存のテーブルにデータを格納するために設定するファイル。
記述し、`rails db:seed`を実行するとデータベースにデータが格納される。[^7]

## /lib
自作のモジュール[^8]を置く場所。
ここにモジュールを置いて、`require`で呼び出す。[^9]

## /log
いわゆるログファイル。デフォルトでは中身はない。
`logger.debug`を使うことで、`log/development.log`にlogを出力できる。

## /public
`404.html`や`500.html`などRailsを使用しない静的ページや画像を格納する場所。
デプロイ時とかでお世話になるかも。

## /storage
Active Storage等を使用した際にlocalでデフォルトで投稿されたファイルが保存される場所。[^10]
デフォルトでは中身はない。

## /test
作ったアプリケーションが正しく動作するのかという確認するファイルをまとめたフォルダ。
テストを行うことで正しい動作を保証し、品質の高いアプリケーションを仕上げる事につながる。
コントローラーやモデルが作られると同時にコントローラー、モデル名の名前のファイルが作成される。
Minitestなどを使いテストをしていくのが主流。Rspecは/specが別途作られる。

## /tmp
一時ファイルを保存するためのファイルをまとめたフォルダ。

## /vendor
vendorは自分が開発しているものではないサードパーティのライブラリ(jsフレームワークやcssフレームワークなど)を格納する場所。
デフォルトでは中身はない。
ここにライブラリを置いて、`require`で呼び出す。[^11]

## Gemfile
現在のアプリケーションで使うgemをまとめているファイル。
このファイルに追加したいgemを記入し、`bundle install`を実行するとgemがinstallされる。

## Gemfile.lock
Gemfileを元に依存関係にあるgemのバージョンと取得先が記録される。
実際にインストールしたgemのリストという認識。
`bundle install`や`bundle update`で更新される。

# おわりに

この記事書くだけでもかなり勉強になりました。アウトプットはやはりよい。
かなりざっくりしていて、全てのファイルは紹介しきれていませんが、ふんわりこんな内容なんだと掴んでいただければ幸いです。
間違っていたりしたら報告していただけると泣いて喜びます。
私の他にもDMM WEBCAMPのメンターや社員さんが記事を書かれているので、よければご覧になってください。

[^1]: rubyのライブラリの総称（ https://www.ruby-lang.org/ja/libraries/ ）
[^2]: https://github.com/rails/webpacker, https://qiita.com/ttiger55/items/e45ec0febba3a412507e
[^3]: https://qiita.com/yukiyoshimura/items/f0763e187008aca46fb4
[^4]: https://qiita.com/ayasuda/items/7edcef9f9508d35cb3dd
[^5]: https://qiita.com/Yama-to/items/587544993fb62610528a
[^6]: https://railsguides.jp/routing.html#crud%E3%80%81%E5%8B%95%E8%A9%9E%E3%80%81%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
[^7]: https://qiita.com/takehanKosuke/items/79a66751fe95010ea5ee
[^8]: https://qiita.com/shiopon01/items/fd6803f792398c5219cd
[^9]: https://qiita.com/necojackarc/items/fb76352dbea5bdd83366
[^10]: https://qiita.com/hmmrjn/items/7cc5e5348755c517458a
[^11]: https://qiita.com/shi-ma-da/items/cb50ff7fdd9e21431b7c