pathヘルパー(_path)が返すのは相対パス?絶対パス?: Railsチュートリアル備忘録


pathヘルパー(_path)が返すのは相対パス?絶対パス?: Railsチュートリアル備忘録

pathヘルパーとurlヘルパーの使いどころの違いを調べていると
”pathヘルパーは相対パス、urlヘルパーは絶対パスを返す”

というような表記がされることに違和感を感じて調べてみた

前提としてローカル環境に限っては

my_roomというディレクトリを示す以下の様なフルパス(完全なパス)が存在する時

/my_city/my_home/my_room/i_am_here.html.erb

絶対パス (=フルパス)

/(ルート: 最上層のディレクトリ)から見たパス(経路)
表記は必ず先頭に/(ルート)がくる

/my_city/my_home/my_room/i_am_here.html.erb # rootからみたi_am_here.html.erbのパス表記

相対パス

現在いる場所から見たパス(経路)
表記は先頭に/(ルート)を含まない

my_home/my_room/i_am_here.html.erb  # my_cityからみたi_am_here.html.erbのパス表記
my_room/i_am_here.html.erb          # my_homeからみたi_am_here.html.erbのパス表記
../i_am_here.html.erb       # i_am_here.html.erbからみたmy_homeのパス表記

というようにシンプルに考える事ができる

Railsの開発環境においては?

/のあり表記、なし表記の混在

これまで2つの表記があり、それを曖昧にしてきた

ルーティングを記載する場合に
Railsチュートリアルでは/(ルート)をつけるのに対して
Progateでは/(ルート)をつけない表記(link_toなどでは/がついているのに)となっていた

これは理解が簡単で
Progate式に/ なしでルーティング記述しても

  get 'help',      to: 'static_pages#help'  # help -> /helpでも実行結果は同じ
  get 'about',     to: 'static_pages#about'
.
.
.  

実際のルーティングを確認すると
/(ルート)が補完されていることがわかる

$ rails routes
    Prefix Verb   URI Pattern       Controller#Action
     root GET    /                                  static_pages#home
     help GET    /help(.:format)        static_pages#help
  about GET    /about(.:format)     static_pages#about
.
.
.

Railsが勝手に補完してくれるからどちらの表記でも良いが
内部処理した結果は/を基準とした、絶対パスのような表記に見える

pathヘルパーは相対パスを返す?

また、Railsチュートリアルでお世話になるpathヘルパー
`resouceがもたらしてくれるあいつ

以下を参考にすると
ルーティングの記述と同様
pathヘルパーは/を基準とした絶対パス?を返しているようにみえる

2.3 パスとURL用ヘルパー
リソースフルなルーティングを作成すると、アプリケーションのコントローラで多くのヘルパーが利用できるようになります。resources :photosというルーティングを例に取ってみましょう。

photos_pathは/photosを返します
new_photo_pathは/photos/newを返します
edit_photo_path(:id)は/photos/:id/editを返します (edit_photo_path(10)であれば/photos/10/editが返されます)
photo_path(:id)は/photos/:idを返します。 (photo_path(10)であれば/photos/10が返されます)
これらの_pathヘルパーには、それぞれに対応する_urlヘルパー (photos_urlなど) があります。_urlヘルパーは、_pathの前に現在のホスト名、ポート番号、パスのプレフィックスが追加されている点が異なります。

Rails のルーティング - Railsガイド

これって絶対パスなの?相対パスなの?

Railsが扱っているパスは絶対パスなの?相対パスなの?と考える上で
以下のサイトが参考になった

【初心者向け】絶対パスと相対パスの違いをイラストを使って解説! | webliker

つまりRailsが扱っている/...というパスは
相対ルートパスなるもので、ルートパス(相対的、仮想的な?ルート)を基準とした絶対パスのようなもの
と理解した

開発環境から、本番環境への移行が想定されるので
(最初の例ではhomeディレクトリは別のcityディレクトリへの引っ越しが決まっている)
開発環境においてフルパス表記とするすることは得策でない
かつ相対パスがもつ構造変化に対する脆弱性を回避するために
ルート相対パスが便利なんだろう

urlヘルパーは絶対パス?

再び上記Railsガイドを参考にすると

pathヘルパーがルート相対パスを返すのに対して
urlヘルパーは自身が置かれれた環境における(本番環境なら本番環境のサーバーに応じた)
フルパスを取得して返していると考えられる

Reference:

pathメソッドと_urlメソッドの使い分け - Qiita

違いを説明できますか?「フルパス」「絶対パス」「相対パス」の違い フラップイズム