ルーティングは極力ルーティングヘルパーを使おう

この記事はプログラミング学習者がアプリ開発中に躓いた内容を備忘録として記事におこしたものです。内容に不備などあればご指摘頂けると助かります。

## 記事投稿の背景
この記事ではアプリ制作中に分かったview側でのルート指定の方法やそれぞれのルーティングのメリット・デメリットをご紹介していきます。

## ルート指定の方法

以下の資料はRailsで閲覧できるルーティングのリストです。
```ruby:docker compose exec web bin/rails routes
docker compose exec web bin/rails routes
                                  Prefix Verb     URI Pattern                                                                                       Controller#Action
                              home_index GET      /home/index(.:format)                                                                             home#index
                                    root GET      /                                                                                                 home#index
                             follow_user POST     /users/:id/follow(.:format)                                                                       users#follow
                           unfollow_user DELETE   /users/:id/unfollow(.:format)                                                                     users#unfollow
                               edit_user GET      /users/:id/edit(.:format)                                                                         users#edit
                                    user GET      /users/:id(.:format)                                                                              users#show
                                         PATCH    /users/:id(.:format)                                                                              users#update
                                         PUT      /users/:id(.:format)                                                                              users#update                                            
```
ルート指定には２つの方法があります。
- URLを直接指定してルートを設定する
例：`/users/:id/follow`
メリット：ブラウザのURL欄に表示される内容と同じ記法なので直感的で分かり易い
デメリット：URLを手動で管理する必要がある為、メンテナンス性が悪い  
- ルーティングヘルパーを使ってルートを設定する
例：`/users/tweet.user.id/follow`
メリット：URLの変更が合った場合でも自動的にルーティングヘルパーが対応してくれるのでメンテナンス性が高い
デメリット：慣れるまではヘルパーを見ただけでは何のアクションか判断し辛い

## ルーティングヘルパーを使った方がいい理由
- メンテナンス性
URLの変更が起こっても自動的にヘルパーが対応してくれる  
- オブジェクトからidを拾ってくれるのでコードが冗長にならない
例：`/users/#{tweet.user.id}/follow`
とすることでURLを直接入力してもルーティングは可能です。
一方でルーティングヘルパーを使った場合、
例：`follow_user_path(tweet.user)`と書くことができます。
これらURLを使った書き方とルーティングヘルパーを使った書き方で記法は違いますが、結果は同じ内容になります。
ルーティングヘルパーを使った場合、URLの記法と違って`id`を渡す書き方を必要としません。
オブジェクトを渡すことで(例ではtweet.user)、Railsが自動的にオブジェクトから`id`を取得してくれます。
また、`id`の記述を省けるのでコードも簡潔になります。
悪い例として`follow_user_path(id: tweet.user.id)`を挙げておきます。
これは私のルーティングヘルパーへの理解度が低い時に書いたコードです。
ルーティングヘルパーを使っているので、`id`をオブジェクトから拾ってくれるのにわざわざ冗長な書き方をしています。

#### 以上の理由から極力ルーティングヘルパーを使うのが好ましいと考えられます。

## ルーティングヘルパーを使えない場合はこうやろう
一つのコントローラー内で複数のアクションを使おうとするとルーティングヘルパーが表示されないことがあります。
以下は表示されない時の例です。
![スクリーンショット 2024-10-10 21.31.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/72b8bb1f-bd30-ad1d-2dd1-e3ae5eabc9a8.png)
`update`アクション２つ(PATACHとPUT)と`destroy`アクションに関しては左側にルーティングヘルパーが表示されていません。
これは複数のルーティングでヘルパーにすべき名前が衝突してしまった場合は１つだけしか作られないからです。
`update`,`destroy`アクションでも`user_path`を使いたいけど、既に`show`アクションで使われているので、他のアクションには割り当てることができません。

このような場合、解決策が２つ挙げられます。
- 1, カスタムルーティングを設定する
```ruby:routes.rb
resources :users do
  member do
    post 'follow'
    delete 'unfollow'
  end
end
```
`member do`を加えることで`/users/:id/follow`や`/users/:id/unfollow`に対してルートが動作するようにできます。
この書き方をすることで`user_path`というルーティングヘルパーを使わずに代わりに`follow_user_path`や`unfollow_user_path`といったヘルパーを自動生成できます。
これにより名前が重複することによってルーティングヘルパーが表示されていなかったアクションに対してヘルパーを割り当てることができるようになります。
以下はルーティングヘルパーが表示された時のルート一覧の抜粋です。
![スクリーンショット 2024-10-11 6.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/48358dff-8a4e-2d51-8d33-f5fe2a6a0ce0.png)

- 2, 名前付きルートを使う
```ruby:routes.rb
post '/users/:id/follow', to: 'users#follow', as: 'follow_user'
delete '/users/:id/unfollow', to: 'users#unfollow', as: 'unfollow_user'
```
名前付きルート(`as:`オプション)を使うことで、特定のルートに対して独自の名前を定義でき、その名前に基づいたルーティングヘルパーを生成できます。
上の例でもカスタムルーティングの時と同様に`follow_user_path`や`unfollow_user_path`というルーティングヘルパーが生成されます。

以上でルーティングヘルパーに関して説明を終わらせて頂きます。
最後まで読んで頂きありがとうございました。

## 今回参考にした資料
[【初学者向け】_urlや_pathといったヘルパーメソッドの使い方](https://qiita.com/Shugo_Y/items/412d7660f259eddf9c66)