【Ruby on Rails】ルーティングの:asについて

## 自己紹介
はじめまして、はると申します。現在はスクールに通いながら学習をしています。
今回、スクール内の
技術記事を書いてみんなでアドベントカレンダーを完成させよう！Advent Calendar Challenge
という、初めての方も技術記事を書いてみよう！という趣旨の企画に参加させていただきました🥳
この機会に、苦手なまま放置していたところを理解しようと思い、記事にまとめました。
　
## 概要
Ruby on Railsのルーティングで出てくる`:as`について、何の必要があってどういう時に使うのか？
ルーティングを学習する中で、オプションが沢山出てきてごちゃ混ぜになっていたので、
整理しながら学習しまとめてみました。
初学者のため、間違っている箇所もあるかもしれませんのでその際は教えて頂けると嬉しいです🙇
（一部GPTからの情報もあります）
　
## ルーティングに関する用語
ルーティングに関する用語についても理解が怪しい部分があったのでおさらいから始めます。
基礎の部分を読み飛ばしたい方は[こちら](#asについて)から。
　
#### ルーティングとは
ルーティングは、送信されたリクエストに対し、どのコントローラーのアクションを動かすのかを設定する場所です。[1）](#参考引用記事)
あくまでルーティングは行動の対応表でしかなく、実際のアプリ内の動作は、ルーティングで動くように設定したコントローラーのアクションの内容が関わっています。
　
#### ヘルパーメソッド
ヘルパーメソッドとは、**ビューやコントローラー内で使用できる便利なメソッド**のこと。例として、`xxx_path`、`link_to`、`url_for`などがある。
名前付きルーティングヘルパーも含む。
　
#### 名前付きルーティングヘルパー
名前付きルーティングヘルパーとは、`xxx_path`という形のもの。
　 
#### パスとURLの違い
パス（英：path）とはファイルやフォルダの置いてある場所を示す情報。あるいは「ファイルやフォルダの置いてある場所を示す情報」＋「ファイルの名前」のことです。[2)](#参考引用記事)
Railsのルーティングにおけるパスが指すのは、URLの中の末尾の`/posts/new`などの一部分のことを言い、ルーティングから生成されている。
 
URL（読：ユーアールエル）とはホームページの「住所」に相当する情報。もう少し具体的に書くとホームページの置いてある場所とかファイル名とかを示す情報です。[3)](#参考引用記事)
 
## ルーティングの基本の書き方
こちらもおさらいです。下記は全て異なるルーティングの記載方法です。色々な書き方があって混乱していたので整理します。

```routes.rb
  get 'sessions/new'
  get :sign_up, to: 'users#new'
  resources :posts
  get 'login' => 'user_sessions#new'
```

#### get 'hoge/huga'
`'hoges/fuga'`というパスにアクセスした際に、`'hoges#huga'`アクションを呼び出すルートを定義しています。
 
#### get :hoge, to: 'controllers#action'
`'controllers#action'`を呼び出すルートを定義しています。`:hoge`は名前付きルーティングヘルパーの一部として、ルートへのリンクを生成するのに使えます。
（`hoge_path`が使えるようになります）
 
#### resources
resourcesメソッドとは、railsで定義されている7つのアクションのルーティングを自動で作成するメソッドです。[4)](#参考引用記事)
詳しくは今回は割愛します。（参考記事のRailsガイド等を参照ください。）
 
#### get 'hoge' => 'controllers#action'
上記の、`get :hoge, to: 'controllers#action'`と同じ意味で書き換えが可能です。

::: note warn
`=>`をハッシュロケットと言い、この記載方法は古い書き方のため、シンボルの書き方をした方が良さそうです。
:::



## `:as`について
やっと本題に入ります。

#### `:as`をつけると、生成されるパスやURLにどんな変化があるのか？
例として、下記のルーティングがあります。
```routes.rb
get 'login', to: 'user_sessions#new', as: :login
```
**GETリクエストで`/login`のパスにアクセスする、 `login_path`が生成されます。**

では、`:as`が無いとどう変わるのか確認しました。
```routes.rb
get 'login', to: 'user_sessions#new'
```
同じく、**GETリクエストで`/login`のパスにアクセスする、`login_path`が生成されました。**
 
🤔🤔🤔
 
#### `:as`が無いのに名前付きルーティングが生成されるのはなぜ？
試しに、`get 'login'`の部分を、`get 'hoge'`に変更してみました。
```routes.rb
get 'hoge', to: 'user_sessions#new'
```
すると、**GETリクエストで`/hoge`のパスにアクセスする、`hoge_path`が生成されました。**
パス名は変わりましたが、動作するコントローラーとアクションは変わらないので、実際の動作は同じです。
 
- `:as`が無くても名前付きルーティングヘルパー自体は生成される。
- その際、get等の後の`'文字列'`や`:シンボル`の部分が、アクセスするパスに使用され、名前付きルーティングヘルパーの一部にも使用される。

ということが判明しました。


#### 結局`:as`はどういう時に使ったらいいのか？
さらに、`get 'hoge'`の状態で`as: :login`を付け加えてみました。
```routes.rb
get 'hoge', to: 'user_sessions#new', as: :login
```
すると、**GETリクエストで`/hoge`のパスにアクセスする、`login_path`が生成されました。**
こちらも動作するアクションは同様です。
パス名とルーティングヘルパー名がちぐはぐで、とってもわかりにくくなっています。
 
- `:as`を使うと、パス名が`hoge`でも`fuga`でも、名前付きルーティングヘルパーは常に`login_path`として使えるようになる。
- `get 'hoge'`の部分はどのような文字列でも設定可能だが、名前付きルーティングと同様に、アクションの内容に関連した語句にする必要がある。(とってもわかりにくくなってしまうため)



::: note
以上より、`:as`を使うべきタイミングは、パス名と、名前付きヘルパーメソッドに異なる名前をつけたい時に使うのではないかと考えました。
:::
（学習中の現時点では、あえて`:as`でルーティングヘルパーの名前をつける場面にあまり遭遇しておらず、技術記事も見つけられなかったため、このような結論に至りました。）
 
## まとめ
- :asが無くても名前付きルーティングヘルパー自体は生成される。
- :asを使うべきタイミングは、パス名と、名前付きヘルパーメソッドに異なる名前をつけたい時
- 今後転職ができた際には、実務の中で`:as`がどのような使われ方をしているか学んでいきたいと思います。
　
## 参考・引用記事
#### 引用記事
1）[【Rails】 MVCフレームワークを初心者向けに丁寧に解説！](https://pikawaka.com/rails/mvc)
2）[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典　『パス』](https://wa3.i-3-i.info/word1166.html)
3）[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典　『URL』](https://wa3.i-3-i.info/word114.html)
4）[【Rails】 resourcesメソッドを使ってルーティングを定義しよう！](https://pikawaka.com/rails/resources)
 
#### 参考記事
- [Railsガイド Railsのルーティング](https://railsguides.jp/routing.html)
- [【Ruby on Rails】便利なヘルパーメソッド](https://qiita.com/mitanih/items/d83d0e732a103482f17c)
- [Railsガイド Railsのルーティング（resources）](https://railsguides.jp/routing.html#crud%E3%80%81verb%E3%80%81%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)
- [【Ruby / RubyonRails】ロケットハッシュの書き方は古い？シンボルの書き方をしよう](https://sakurawi.hateblo.jp/entry/hash-rocket)
- [【Rails】routes.rbでのasオプション](https://qiita.com/xusaku_/items/c5c9137d580db1c19a22)
- [ササソニのRails備忘録～routesのasについて～](https://qiita.com/sasasoni/items/7e718438b606a90f6a0b)