【学習メモ】rails_routes has_many ログからエラーの原因を推測

#目次
- rails routesが何を指しているのか
- DELETEメソッドについて
- has_manyとbelongs_toとリレーションについて
- ログからエラーの原因を推測するコツ
- 参考記事
- 今回使用した画面（一部）


##rails routesが何を指しているのか

``rails routes``で確認した画面は下記の通りです。
``records GET``の下に「POST」だけ記載がありますが、``records POST``の省略です。

```
                  records GET    /records(.:format)                                                                       records#index
                          POST   /records(.:format)                                                                       records#create
               new_record GET    /records/new(.:format)                                                                   records#new
              edit_record GET    /records/:id/edit(.:format)                                                              records#edit
                   record GET    /records/:id(.:format)                                                                   records#show
                          PATCH  /records/:id(.:format)                                                                   records#update
                          PUT    /records/:id(.:format)                                                                   records#update
                          DELETE /records/:id(.:format)                                                                   records#destroy
                     root GET    /                                                                                        records#index
```

###補足：EDITの例

編集画面に遷移したい時、``rails routes``で内容確認します。

```
              edit_record GET    /records/:id/edit(.:format)                                                              records#edit
```

これは、editアクションするためには、HTTPメソッド：GETが実行され、パスにidを含めなさいという意味になる。書き方はこんな感じです。

```ruby
url: record_path(@record.id) #記載例
```

##DELETEメソッドについて

かなり初歩的な内容ですが、

- DELETEメソッド：HTTPから送るメソッド
- destroyアクション：controllerで設定するアクション
- method: :delete　：destroyアクションを実行するために決めるもの（method: :postだとHTTPメソッドではPOSTが実行される）

viewでは、
（誤）method: :destroy
（正）method: :delete

と理解が深まりました。


##has_manyとbelongs_toとリレーションについて

**「1対多」と「多対多」ってどう違うのでしょうか？**

**例**
User：親テーブル
Record：子テーブル
Task：孫テーブル

★Userについて★
Userから見て、1つのUser_idが複数のカラムのRecordを持っている
→has_manyの関係
→1対多
→複数形

```
has_many :records
```
（Taskは書いてもいいけど、RecordとTaskで関係性を記述するので親ー孫関係は書かなくてもOK）


★Recordについて★
①Recordから見て、1つのRecord_idは、複数のTaskを持っている
②Recordから見て、1つのRecord_idが1つのUser＿idに所属している

①の場合
→has_manyの関係性
→1対多
→複数形

```
has_many :tasks dependent: :destroy #dependent: :destroyを付けないと依存するデータ（ここでは紐付けするRecordテーブルのデータ）も一緒に削除ができない
```

②の場合
→belongs_toの関係性
→1対多
→単数形

```
belongs_to :user
```

※時間の都合上、taskは省略


###補足
最初は「through: (:arg)」を入れたらいけないの？と思っていたが、「複数のカラムを持つテーブルXが、複数のカラムを持つテーブルZとデータを紐付けたい時に、中間テーブルYを作成して紐付けする」といった使い方の模様。詳細はこちらの記事参照してください。

[factory_botでhas_many throughアソシエーションを作成](https://qiita.com/takehanKosuke/items/ae324483e7f9451bf6a7)



##ログからエラーの原因を推測するコツ

色々見る箇所はありますが、状況把握が大事！ざっとこんな所を見てはいかがでしょうか？

**※基本上から順番に見るものでまとめています。順番を飛ばしても解決できません！**

- HTTPメソッドが正しいか？（POST？GET?PUT？DELETE?）
- どのControllerのActionが実行されているか？（Processing by 〜〜Controller#update等）
- パスは正しいか？（idが必要なのか、root_pathで良いか？等）
- Parametersはどんなものが処理されているのか？
- SQLではどんな処理がされているか？（SELECT？）
- Unpermitted parameters:の記載が無いか？
- ROLLBACKの表記はあるか？
- Renderingではどんな処理がされているのか？

まだまだありますが、思いついたら別記事にてアウトプットします。

##参考記事

[factory_botでhas_many throughアソシエーションを作成](https://qiita.com/takehanKosuke/items/ae324483e7f9451bf6a7)

[Rails アソシエーションのhas_many・belongs_toについてまとめてみた](https://qiita.com/taka_yuki/items/13642a29be9944d94cac)

[Railsで1:多のモデルを消す際にエラーが出る。](https://ja.stackoverflow.com/questions/41525/rails%E3%81%A71%E5%A4%9A%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E6%B6%88%E3%81%99%E9%9A%9B%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%82%8B)

[【Rails】DBのデータをビューで使用する](https://qiita.com/Hal_mai/items/aed97a6aba2293450a74)

[Rails 削除機能の実装方法　手順](https://qiita.com/STHEXA/items/bebd35d67013fe0f19dd)

[rails whereメソッドとfindメソッドの違い　メモ](https://qiita.com/STHEXA/items/5be8636eb3bcb7069e88)

[find、find_by、whereの違い](https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3)

[Railsで1つのフォームで複数のモデルを登録・更新させる](https://qiita.com/tmzkysk/items/6349d8d860c5982771ff)

[Railsのaccepts_nested_attributes_forについて解説してみた。](https://hirocorpblog.com/post-213/)

[mergeメソッドで、入力してもらったparamsと一緒に予め別のテーブルに持っている情報を保存する](https://qiita.com/rentalgambler/items/a89760f8e6c10423539b)

##今回使用した画面（一部）
ご興味のある方は見ていただくと良いかもしれないです。


```console
Started PATCH "/records/24" for ::1 at 2020-06-04 21:08:14 +0900
Processing by RecordsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"EsDVxGNvyCoVaZDhZ0Dubc7Cg8qAM8W67iFa6dl8pD0hl7mdfj5AF5t+43SC5ej1Opes4vQivAxwx8Hn8lFwxg==", "record"=>{"training_date"=>"2020-05-29", "outputs"=>{"output_name"=>"tester"}, "practices"=>{"practice_item"=>"3球目攻撃", "practice_time"=>"4"}, "learning_point"=>"テストだよ", "tasks"=>{"task_name"=>"tester"}}, "commit"=>"この内容で更新する", "id"=>"24"}
  User Load (1.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 3], ["LIMIT", 1]]
  ↳ /Users/user/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-5.2.4.3/lib/active_record/log_subscriber.rb:98
  Record Load (0.3ms)  SELECT  "records".* FROM "records" WHERE "records"."id" = $1 LIMIT $2  [["id", 24], ["LIMIT", 1]]
  ↳ app/controllers/records_controller.rb:45
Unpermitted parameters: :outputs, :practices, :tasks
   (0.2ms)  BEGIN
  ↳ app/controllers/records_controller.rb:46
   (0.6ms)  ROLLBACK
  ↳ app/controllers/records_controller.rb:46
  Rendering records/edit.html.slim within layouts/application
  Rendered records/edit.html.slim within layouts/application (7.9ms)
  Rendered records/_header.html.slim (5.1ms)
Completed 200 OK in 132ms (Views: 84.4ms | ActiveRecord: 9.1ms)

```