Ruby on Rails でアプリケーションを制作する。

# Ruby on Rails でアプリケーションを新規作成する。

```
$ rails new アプリケーション名 -オプション名
```
- データベースに MySQL を使用する場合は、オプション名に `-d mysql` と記述する。  
※ デフォルトは SQLite を使用している。

# データベースを作成する。

```
$ rails db:create
```

# ルーティングを生成する。

```config/routes.rb
Rails.application.routes.draw do
  [HTTPメソッド] '[URIパターン]', to: '[コントローラー名]#[アクション名]'

  root to: 'コントローラー名#アクション名'
    # ルートパス （get '/', to: '[コントローラー名]#[アクション名]'） にリクエストする。

  resources :コントローラー名, only: [:アクション名]
    # "resources"メソッドを使用すると、指定したコントローラーの 7つのアクション （index,new,create,show,edit,update,destroy） のルーティングが設定される。
    # "only"オプションを使用すると、7つのアクション全てではなく、指定しただけのアクションのルーティングが設定される。
end
```

- HTTPメソッドの種類
    - GET：ページを表示する時に使用する。
    - POST：フォームからデータを送信して、登録する時に使用する。
    - PUT：データを変更する時に使用する。
    - DELETE：データを削除する時に使用する。

- アプリケーションのルーティングを確認する時はターミナルで `$ rails routes` を実行する。

- Prefix
  - `Prefix名_path` と記述することで、リンク先等のパスとして扱える。

# コントローラーを作成する。

```
$ rails g controller コントローラー名
```

- ルーティングから送られたリクエストに対応する７つのアクション
    - `index`：
    - `new`：
    - `create`：
    - `show`：
    - `edit`：
    - `update`：
    - `destroy`：

# モデルを作成する。

```
$rails g model モデル名
```

1. マイグレーションファイルにテーブルに必要なカラムを記述する。

```マイグレーションファイル.rb
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.型 :カラム名, null: false
        # "null: false" は空のデータが登録できないようにする必須項目に付けるバリデーション （モデルファイルにも要記述）
      t.timestamps
    end
  end
end
```

- 型の種類
    - `integer`：数値
    - `string`：文字列
    - `text`：文字列（長文）
    - `boolean`：選択肢
    - `datetime`：日付・時刻

2. マイグレーションファイルに必要なカラムを記述したらマイグレーションをする。

```
$ rails db:migrate
```

- もし、マイグレーションした後にマイグレーションファイルの修正をする場合には、`$ rails db:rollback` を実行して、データベースから差し戻す必要がある。
- 現状 マイグレーションファイルがデータベースに適用されているか確認するには `$ rails db:migrate:status` を実行する。

## データベースに一度 上げたテーブルの情報を追加・削除・変更するには…

- `$ rails g migration Addカラム名Toテーブル名 カラム名:型` という形で実行する。
  - `Addカラム名Toテーブル名` の部分は、単語の頭文字を大文字にして、スペースを開けずに記述する。

# ヘルパーメソッド

```.html
<%= link_to 'リンクに表示する文字', 'リンク先のURL' %>
```

# ビューファイルにデータベースのテーブルに保存されている値を表示する。

1. コントローラーでモデルからテーブルの値を取得する。

```_controller.rb
class PostsController < ApplicationController
  def アクション名
    @変数名 = " ● ● ● "
      # コントローラーでインスタンス変数を定義しておくと、ビューファイルで "<%= @変数名 %>" 呼び出すことができる。

    @変数名 = モデル名.ActiveRecordクラスメソッド
      # 取得したい値があるモデル名の ActiveRecord クラスメソッドを指定して、インスタンス変数に代入する。すると、ビューファイルで変数名を指定することで値を表示できる。
  end
end
```

- ActiveRecord クラスメソッドの種類
  - `all`：テーブルの全てのデータを取得する。
  - `find(●)`：テーブルの中の特定のレコードを取得する。
  - `new`：新しくレコードを生成する。
  - `save`：特定のレコードに保存する。

2. 取得した値をビューファイルに記述する。

```.html
<%= @変数名.カラム名 %>
  <!-- "find(●)" メソッドを指定して、特定のレコードを取得した場合は、代入した変数名に表示したいカラム名を記述する。 -->

<% @コントローラで代入したインスタンス変数名.each do |変数名| %>
  <%= 変数名.カラム名 %>
<% end %>
  <!-- "all" メソッドを指定して、複数のレコードを取得した場合は、Each文を利用してレコード 1つずつ取り出してから表示する。 -->
```

# フォームを作成する。
## ビューファイルにフォームを作成する。

```.html
<%= form_with model: @コントローラでモデルに新しくレコードを生成する値を代入するインスタンス変数名, url: フォームを送信するコントローラの Createアクションの Prefix_path, local: true do |form| %> 
  <%= form.フォームのヘルパーメソッドの種類 :カラムの名前 %> 
<% end %>
```

- " type="" " 属性の値の種類
  - `type="text"`：テキストフォーム
  - `type="password"`：パスワードフォーム
  - `type="checkbox"`：チェックボックス
  - `type="radio"`：ラジオボタン
  - `type="submit"`：送信ボタン

## ルーティングに送信ボタンを押した後のリクエスト先を記述する。

```config/routes.rb
post '[URIパターン]', to: '[コントローラー名]#create'
  # フォームからデータを送信して 登録する操作をするので、HTTPメソッドに "POST"
  # データの投稿をするリクエストには、"Create" アクション
```

## コントローラでテーブルにレコードを追加する。

```_controller.rb
def create
  モデル名.create(ストロングパラメータのメソッド名)
    # モデルにレコードを追加する為の .create メソッド
    # フォームから値を受け取る為にストロングパラメータを使用する。
end

private
def ストロングパラメータのメソッド名
  params.require(:インスタンス変数名).permit(:フォームの "name" 属性の値)
    # フォームから送信されてきた値の中で、指定されたフォームを許可する。
end
```