💬

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

に公開

自己紹介

はじめまして、はると申します。現在はスクールに通いながら学習をしています。
今回、スクール内の「技術記事を書いてみんなでアドベントカレンダーを完成させよう!Advent Calendar Challenge」という、初めての方も技術記事を書いてみよう!という趣旨の企画に参加させていただきました🥳
この機会に、苦手なまま放置していたところを理解しようと思い、記事にまとめました。

概要

Ruby on Railsのルーティングで出てくる:asについて、何の必要があってどういう時に使うのか?
ルーティングを学習する中で、オプションが沢山出てきてごちゃ混ぜになっていたので、整理しながら学習しまとめてみました。

ルーティングに関する用語

ルーティングに関する用語についても理解が怪しい部分があったのでおさらいから始めます。
基礎の部分を読み飛ばしたい方はこちらから。

ルーティングとは

ルーティングは、送信されたリクエストに対し、どのコントローラーのアクションを動かすのかを設定する場所です。1)
あくまでルーティングは行動の対応表でしかなく、実際のアプリ内の動作は、ルーティングで動くように設定したコントローラーのアクションの内容が関わっています。

ヘルパーメソッド

ヘルパーメソッドとは、ビューやコントローラー内で使用できる便利なメソッドのこと。例として、xxx_pathlink_tourl_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'と同じ意味で書き換えが可能です。

: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'の部分はどのような文字列でも設定可能だが、名前付きルーティングと同様に、アクションの内容に関連した語句にする必要がある。(とってもわかりにくくなってしまうため)

(学習中の現時点では、あえて:asでルーティングヘルパーの名前をつける場面にあまり遭遇しておらず、技術記事も見つけられなかったため、このような結論に至りました。)

まとめ

  • :asが無くても名前付きルーティングヘルパー自体は生成される。
  • :asを使うべきタイミングは、パス名と、名前付きヘルパーメソッドに異なる名前をつけたい時
  • 今後転職ができた際には、実務の中で:asがどのような使われ方をしているか学んでいきたいと思います。

参考・引用記事

引用記事

1)【Rails】 MVCフレームワークを初心者向けに丁寧に解説!
2)「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 『パス』
3)「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 『URL』
4)【Rails】 resourcesメソッドを使ってルーティングを定義しよう!

参考記事

Discussion