LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-18

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0