例えば、
詳細画面のルーティングを設定しよう
削除画面のルーティングを設定しよう
から始まる一連の実装の流れがあると思うが、
アクション定義時は、
対応するコントローラに、def index〜と、アクションを定義すればいい
ビュー作成時は、
そのアクションに対応するビューを作成すればいい
と、上記二つに関しては、
機能の連携を、頭の中で追いかけながら実装することができる
が、
ルーティングの作成時
時々考えてしまう瞬間があって、
例えば、以下のような
コントローラーのアクションを動かすルーティング
を設定したいとして、
#Tweetsコントローラーのindexアクションを動かしたい
class TweetsController < ApplicationController
def index
@tweets = Tweet.includes(:user)
end
(中略)
下のルーティングが条件反射的に浮かんでしまう。
get 'tweets' => 'tweets#index'
この時、いつも自分は左側のパスの設定に悩まされていて
このパスは一体何に基づいて決定されているのか
URLに基づいて決定されているのか
パスの起点となるリンクの設定が、URLを決め、それに従って、パスもそのように設定するのか
それとも、tweetsコントローラーだから、tweetsにしなければならないのか
コントローラとルーティングどちらを最初に考えるものなのか
要は、ルーティングのパス部分は何に基づいて決まるものなのかが分からなかった。
そこで、この本を参照に考えてみたい。
P31〜32(要約)
Helloコントローラーのindexアクションのルーティングを設定する流れ
# Helloコントローラーのindexアクション
class HelloController < ApplicationController
def index
render plain: '一歩一歩'
end
end
# 自分が推測したルーティング(これしか推測できなかった)
get 'hello' => 'hello#index'
# 紹介されていたルーティング
get 'hello/index', to: 'hello#index'
# この時点でも面食らい、宙に飛ばされた感じがあった...、
引用
これで、「http://localhost:3000/hello/index」 と言うURLが要求されたら、hello#indexアクションを呼び出しなさいと言う意味になります。ここでは、URLと、対応するアクションを同じ名前にしていますが、両者は一致していなくても構いません。例えば、以下の設定により、「http://localhost:3000/hoge/piyo」 で呼び出せるようになります。
# 以下の設定
get 'hoge/piyo', to: 'hello#index'
そもそも両者はあえて異なる名前を付ける必要もないから、本書では、まずは「コントローラー名/アクション名」となるようにURLを決めていくものとします。
つまり、どういうことか、差異を比較
get 'hello' => 'hello#index'
# 「http://localhost:3000/hello」
get 'hello/index', to: 'hello#index'
# 「http://localhost:3000/hello/index」
get 'hoge/piyo', to: 'hello#index'
# 「http://localhost:3000/hoge/piyo」
踏まえて、疑問を考えてみると、
今まで、
このパスが来たら、このコントローラの、このアクションが動く、
このアクションを動かしたいのなら、このようにルーティング(のパス部分)を構成しないといけないと、
何かに基づいてパス部分が規定されているように考えていたのだが、
原理的にはそうではなく、
結局、何で混乱していたかと言うと、
自分で設定したルーティングこそが、
対応させたいコントローラーのアクションを動かすURLを規定していることを知らなかったからだ。