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が扱っているパスは絶対パスなの?相対パスなの?と考える上で
以下のサイトが参考になった
【初心者向け】絶対パスと相対パスの違いをイラストを使って解説! | webliker
つまりRailsが扱っている/...
というパスは
相対ルートパスなるもので、ルートパス(相対的、仮想的な?ルート)を基準とした絶対パスのようなもの
と理解した
開発環境から、本番環境への移行が想定されるので
(最初の例ではhomeディレクトリは別のcityディレクトリへの引っ越しが決まっている)
開発環境においてフルパス表記とするすることは得策でない
かつ相対パスがもつ構造変化に対する脆弱性を回避するために
ルート相対パスが便利なんだろう
urlヘルパーは絶対パス?
再び上記Railsガイドを参考にすると
pathヘルパーがルート相対パスを返すのに対して
urlヘルパーは自身が置かれれた環境における(本番環境なら本番環境のサーバーに応じた)
フルパスを取得して返していると考えられる