概要
Railsでルーティングを設定する際は「とりあえずresources脳」な僕ですが、今日はふと「自分でURLとか設定したいよな…」と思いました。
今回はそんな思いを叶えるべく、調べた内容をまとめます。
(resourcesの名前の起源も下の方で深ぼってみました!)
環境
-
macOS Catalina 10.15.6
-
ruby 2.6.5
-
Rails 6.0.3.4
-
MySQL : 5.6.47
-
Bootstrap : 4.3.1
結論
「Railsガイド : Railsのルーティング」によると、
例えば「マイページ(users#show)」へのリクエストを次のように表現したいとき。
-
prefix : users_profile
-
URI : '/users/:id/profile'
routes.rb
に以下のように記載します。
Rails.application.routes.draw do
get 'users/:id/profile', to: 'users#show', as: 'users_profile'
end
これをrails routes
で確認すると、
prefix | Verb | URI Pattern | Controller#Action |
---|---|---|---|
user_profile | GET | '/users/:id/profile | 'users#show' |
無事に設定できました!
確認
では、動作を確認しましょう。
ターミナルでの操作
1. users_controllerを作成
% rails g controller users
2. ビューファイルの作成と記述
app/views/users/show.html.erb
を作成し、次のように記述します。
<h1>Users#show</h1>
3. URIを直打ちして確認
localhost:3000/users/1/profile
と入力し、確認します!
成功です!
そもそもresourcesって何?
望み通りのルーティングを作成できましたが、一つ疑問が残ります。
「いつも使ってるresourcesって何者?」
というわけで、またまたRailsガイドから引用します。
リソースベースのルーティング (以下リソースルーティング) を使うことで、リソースベースで構成されたコントローラに対応する共通のルーティングを手軽に宣言できます。リソースフルなルーティングを宣言することで、コントローラのindex、show、new、edit、create、update、destroyアクションを個別に宣言しなくても1行で宣言が完了します。
この記述より、resources :users
などは「7つのアクションを持つリソースフルなルーティング」ということができそうです。
しかし、次は「リソースとは何ぞ?」と思いました。もう少し読み進めましょう。
ブラウザはRailsに対してリクエストを送信する際に、特定のHTTPメソッド (GET、POST、PATCH、PUT、DELETEなど) を使って、URLに対するリクエストを作成します。上に述べたHTTPメソッドは、いずれもリソースに対して特定の操作の実行を指示するリクエストです。リソースルーティングでは、関連するさまざまなリクエストを1つのコントローラ内のアクションに割り当てます。
これでもイマイチ微妙です。
ということで「Web リソース とは」とGoogleで検索してみました。
メタディスクリプションをサラッと読んで内容をまとめると「Webリソース=Webサイトを構成するもの」とのこと。
自分なりに噛み砕いてみると、Webを構成するものとは、
- ページ
- 保存された情報
- 投稿を保存するテーブル
であるならば、例えば...
- 一覧情報、かつそれをまとめたページを返すindexアクション
- 新たにテーブルにデータを保存するcreateアクション
- 既に存在するデータを削除するdestroyアクション
これらのような「Web上のリソースを扱うアクション」をリクエストするルーティングを、リソースルーティングと呼ぶのにも納得がいきます。
なるほど、だからresourcesだったんですね...
まとめ
-
Verb 'URI', to: 'Controller#Action', as: 'Prefix'
-
上の記述で所望のルーティングを作成できる
-
resourcesは「Webリソースを扱うアクションにリクエストするルーティング」という意味で用いられる(と予想している)