【Rails7】マイグレーション作成からビュー表示までの手順

# 概要
マイグレーションを作成し、ビューを表示するまでのチートシートです。
ハッカソンでフロントエンドとバックエンドのメンバーを分けた際に、早くビューを編集可能にしたかったので作成しました。
とにかくビューの編集に早く着手したいという人向け。

マイグレーションは後から編集するのにファイルを追加する必要があり、最初に詳細に設定することが重要であると考えているため、情報量多めです。

**環境**
M1 Mac
Docker version 24.0.5, build ced0996
Docker Compose version v2.20.2-desktop.1
ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [aarch64-linux]
Rails 7.0.7

## マイグレーション作成
モデル作成コマンドを実行すると、同時に行われるのでスキップ

## モデル作成
```
rails generate model 名前 [カラム名:型..] [オプション]
```
コマンド例
```
rails g model article body:string title:string
```
<details><summary>実行後ターミナルの表示</summary><div>

```
$ rails generate model article body:string title:string
      invoke  active_record
      create    db/migrate/20230820024818_create_articles.rb
      create    app/models/article.rb
      invoke    test_unit
      create      test/models/article_test.rb
      create      test/fixtures/articles.yml
```
</div></details>

## マイグレーション編集
DBにバリデーションが必要な場合、この時点でマイグレーションファイルを編集する。
※DBにバリデーションを後から追加する場合、新たにマイグレーションファイルを作成する必要が出てくるから
<details><summary>型</summary><div>

string : 文字列（最大文字数はおよそ255文字）
text : 長い文字列
integer : 整数
float : 浮動小数
decimal : 精度の高い小数
datetime : 日時
timestamp : タイムスタンプ
time : 時間
date : 日付
binary : バイナリデータ
boolean : Boolean型
</div></details>

外部キーのカラム

```ruby
#　ユーザテーブルに紐づいてる外部キー。非ヌル制約付き
t.references :user, foreign_key: true, null: false
```

### マイグレーションファイルのオプションの指定
```ruby:nullに関する制約・デフォルト値に関する設定
#nullを許容しない　デフォルト値は名無し
add_column :users, :name, :string, null: false, default: '名無し'
```
```ruby:ユニーク（一意性）に関する制約
# 一意性制約
add_index :users, :email, unique: true
```
```ruby:小数点以下の制度に関する制約
# 計測は小数点以下第六位まで(precisionオプションの追加はrails6から)
t.datetime "updated_at", precision: 6
```
<details><summary>インデックスの追加方法</summary><div>

```ruby
class CreatePosts < ActiveRecord::Migration[6.1]
  def change
    create_table :posts do |t|
      t.string :title, null: false
      t.text   :body,  null: false

      t.timestamps
    end
    add_index :posts, :title  
  end
end
```

</div></details>
<details><summary>複数カラムのユニーク制約の設定方法</summary><div>
インデックスをつけて複数カラムのユニーク制約をつけることも可能。ただし、ユニーク制約をつけることは本来のインデックスの役割ではないのでご注意ください。
```ruby
add_index :article_tag_maps, [:article_id, :tag_id], unique: true
# モデル側にも以下のバリデーションをつけることを推奨
# validates :article_id, uniqueness: { scope: :tag_id }
# validates :tag_id, uniqueness: { scope: :article_id }
```
</div></details>

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

## ルーティング作成
7つのアクション(index,show,new,create,edit,update,destroy)のルーティングを作成
```ruby:config/routes.rb
Rails.application.routes.draw do
    # resources リソース名
    resources :articles
end
```

## コントローラ作成
```
rails g controller コントローラー名
```
コマンド例
```
rails g controller articles
```
<details><summary>実行後ターミナルの表示</summary><div>

```
$ rails g controller articles
      create  app/controllers/articles_controller.rb
      invoke  erb
      create    app/views/articles
      invoke  test_unit
      create    test/controllers/articles_controller_test.rb
      invoke  helper
      create    app/helpers/articles_helper.rb
      invoke    test_unit
```
</div></details>

コントローラーに必要なメソッドを記述
```ruby:app/controllers/articles_controller.rb
class ArticlesController < ApplicationController

  # 以下2行が追記（showやcreateなど他にも必要なメソッドがあれば追記）
  def index
  end

end
```

## ビュー作成
コントローラーをコマンドで作成した際に、`app/views`配下にコントローラー名と一致するディレクトリが作られている。
※このqiita記事の場合だと`app/views/articles`ディレクトリ
当該ディレクトリ内にメソッド名を用いたビューを作成する。
```zsh
touch app/views/articles/index.html.erb
```
## ページを表示
http://localhost:3000/<リソース名> にアクセスする。
当記事の場合、　 http://localhost:3000/articles　 にアクセス。
ビューの中身が空っぽであるため、真っ白なページが表示されれば成功！

# 参考
https://railsdoc.com/page/rails_generate_model
https://railsdoc.com/routes
https://railsdoc.com/controller
https://railsdoc.com/page/rails_generate_controller