【Rails】resourcesで設定したCRUDのルーティングヘルパーの表記の仕方

### 0.はじめに
ProgateでRuby on Railsを学習していると、URLパターンでの表記（例：新規登録画面→
`/posts/new`）で進んでいきます。私はその後共同開発に携わる機会があり、
初めて`resouces`の存在とルーティングヘルパーの表記の仕方を学びました。

私のような**「ルーティングヘルパーって何？」**という方に読んで頂ければと思います。

### 1.読んで欲しい人
・「ルーティングヘルパーって何？」「resourcesって何？」という人
・ProgateでRuby on Railsの学習を終えたての人

### 2.使用環境
・mac.os バージョン10.15.6
・Ruby 2.5.1
・Rails 5.2.4.4
・psql (PostgreSQL) 12.5

### 3.resourcesとルーティングヘルパー
#### 3.1 resourcesについて
〜共同開発中〜
私はサイト作成のCRUD処理の一部を担当することになりました。

私：「routeも指定しないとだな」
私の中にはあれ(↓)が浮かんでいます。

```config/route.rb
Rails.application.routes.draw do
  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"
  post "posts/create" => "posts#create"
  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"
  
end
```
Aさん：「resourcesで設定してあるので、routeの設定は終わってます〜」
私：「えっ」

```config/route.rb
Rails.application.routes.draw do
〜略〜
  resources :posts
end
```
`resources :posts`（今回は投稿に関するものなので`posts`とします）の一行で、コントローラの`index`、`show`、`new`、`edit`、`create`、`update`、`destroy`アクションの宣言が完了してしまいます。
参照リンク：[Railsガイド](https://railsguides.jp/routing.html)★2.リソースベースのルーティング
Progateには確かその説明はなかったので驚きました。

#### 3.2ルーティングヘルパーについて
〜プルリク後のコードレビューにて〜
Aさん：「パスの書き方ですが、基本的にはルーティングヘルパーを使ってもらった方が良いかと思います」
私：「えっ」
　・・そうです、またまたあれを浮かべてコードを書いていました。

```app/views/posts/show.html.erb
<div class="post-menus">
  <%= link_to("編集", "/posts/#{@post.id}/edit") %>
  <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: :post}) %>
</div>

```
★`link_to`とは
`link_to("編集","/posts/#{@post.id}/edit")`（1番目の引数にリンクを設定する文字列、2番目の引数にURLを指定してlink_toメソッドを呼び出すこと）でリンクを作成します。
今回だと`<a href ="/posts/#{@post.id}/edit">編集</a>`のaタグが作成されます。
Rubyのコードなので「<%= %>」で囲みます。

ルーティングヘルパーについては、ターミナルで

```
該当のディレクトリ　$ rake routes
```
とすると一覧を表示してくれます。

```
~略~
        posts GET    /posts(.:format)  posts#index                                                                   
              POST   /posts(.:format)  posts#create                                                                     
     new_post GET    /posts/new(.:format) posts#new                                                                    
    edit_post GET    /posts/:id/edit(.:format) posts#edit                                                             
         post GET    /posts/:id(.:format) posts#show                                                                 
              PATCH  /posts/:id(.:format) posts#update                                                                   
              PUT    /posts/:id(.:format) posts#update                                                                    
              DELETE /posts/:id(.:format) posts#destroy                                                                  
```
表にまとめると以下のようになります。ターミナル上の空欄の部分は上と同様という意味です。

|URLパターン| パスをつける | HTTPメソッド  |コントローラ名#アクション | 機能 |
|:-----------|:------------|:------------|:------------|:------------|
| posts    | posts_path     |GET       | posts#index        |一覧        |
| posts    | posts_path     |POST      | posts#create       |登録      |
| new_post  | new_posts_path    |GET      | posts#new      |新規登録画面    |
| edit_post | edit_posts_path   |GET      | posts#edit        |編集画面        |
| post      | post_path         |GET      | posts#show       |詳細          |
| post   | post_path          |PATCHまたはPUT| posts#update      |更新        |
| post   | post_path       |DELETE     | posts#destroy      |削除         |


参照リンク1：[link_toメソッドを使ったリンクの作成](https://www.javadrive.jp/rails/template/index8.html)
参照リンク2：[【Rails入門説明書】routesについて解説]
(https://web-camp.io/magazine/archives/16815)

リンクを参照にルーティングヘルパーに変更します。
参照リンク：[Railsガイド](https://railsguides.jp/routing.html)★2.3パスとURL用ヘルパー

```app/views/posts/show.html.erb
<div class="post-menus">
  <%= link_to("編集", "/posts/#{@post.id}/edit") %>
  <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
</div>

```
↓

```app/views/posts/show.html.erb
<div class="post-menus">
  <%= link_to "編集", edit_post_path(@post) %>
  <%= link_to "削除", post_path(@post), method: :delete %>
</div>

```
**・削除のmethodを`post`から`delete`に変更**
もともと、`post "posts/:id/destroy" => "posts#destroy"`というルーティングを想定していたため`post`にしていましたが、削除のHTTPメソッドは`delete`なので変更しました。
**・idパラメータを`@post`にする**
削除に関してはid情報を持たせる必要があるので、モデルオブジェクト(今回では`@post変数`に格納されている)に変更しました。

### 4.まとめ
他のアクションと一緒にまとめてみます。

```matome.erb
<div class="post-menus">
  <%= link_to "一覧", posts_path %>
  <%= link_to "登録", posts_path, method: :post %>
  <%= link_to "新規登録", new_posts_path %>
  <%= link_to "編集", edit_post_path(@post) %>
  <%= link_to "詳細", post_path(@post) %>
　<%= link_to "更新", post_path(@post), method: :put %>
  <%= link_to "削除", post_path(@post), method: :delete %>
</div>

```
★`method: :put` は`:method => :put`という表記でも可。
★`show``update``destroy`は`post_path` を外し`@post`のみでも可。

| パスをつける | メソッド |メソッド指定 |id |コントローラ名#アクション | 機能 |
|:-----------|:------------|:------------|:------------|:------------|:------------|
| posts_path |GET  | ×  |×  |posts#index        |一覧        |
| posts_path |POST |◎ |×  | posts#create       |登録      |
| new_posts_path    |GET      | ×  |×  |posts#new      |新規登録画面    |
| edit_posts_path   |GET      | ×  |◎  |posts#edit        |編集画面        |
| post_path         |GET      | ×  |◎  |posts#show       |詳細          |
| post_path     |PATCHまたはPUT| ◎  |◎  |posts#update      |更新        |
| post_path       |DELETE |◎  |◎  |posts#destroy      |削除         |


### 5.最後に
記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。