【Rails】rake routesコマンドを徹底解説!
rake routesコマンドとは
routes.rbで定義したルーティングをターミナルで確認することができるコマンドです。
いつ使うのか
ルーティングをresourcesメソッドを使って定義した場合、各アクションのルーティングを確認することができません。
そんなときに「rake routes」コマンドを使用します。
下記のようなルーティングを設定していたとします。
1
2
3
Rails.application.routes.draw do
resources :tweets
end
これだとルーティングの詳細が確認できませんね。
この時ターミナルで「rake rotues」コマンドを実行すると下記の出力結果がターミナルに表示されます。
1
2
3
4
5
6
7
8
9
Prefix Verb URI Pattern Controller#Action
tweets GET /tweets(.:format) tweets#index
POST /tweets(.:format) tweets#create
new_tweet GET /tweets/new(.:format) tweets#new
edit_tweet GET /tweets/:id/edit(.:format) tweets#edit
tweet GET /tweets/:id(.:format) tweets#show
PATCH /tweets/:id(.:format) tweets#update
PUT /tweets/:id(.:format) tweets#update
DELETE /tweets/:id(.:format) tweets#destroy
このようにroutes.rbで定義したルーティングを確認することができました。
ではこの出力結果を詳しくみていきましょう。
一番上の項目は下記の意味があります。
項目 | 意味 |
---|---|
Prefix | パスが入った変数のようなもの。 resourcesメソッドを使ってルーティングを定義すると自動で作成されます。 |
Verb | HTTPメソッドを表します。 URI Patternのパスにどのhttpリクエストでアクセスするかを示しています。 |
URI Pattern | ルーティングのパスを表します |
Controller#Action | httpリクエストでパスが送られた際に処理が行われるコントローラとアクションを表します。 #左がコントローラ名、右がアクション名を示します。 |
Prefixとは?
Prefixはパスが代入されている変数のようなものです。
Prefixを使うときは末尾に「_path」と追記します。
prefixを確認するとルートパスを表す「/」というパスは「root」になっています。
なのでlink_toのパスを指定する場所には「_path」をつけた「root_path」を書いてあげれば「/」で指定した記述と同じになります。
パスにidが入っているときはidの情報が入っているインスタンスを引数として渡してあげることにより指定ができます。
例えばusersコントローラーのshowアクションを動かすときは通常のパスだと「users/"ユーザーのid"」になりますが、Prefixを使って書くと「user_path(@user)」のような記述になります。
上の「@user」はコントローラーで「@user = User.find(params[:id])」などで記述してあげれば@userの中にはそのユーザーのidも含まれているのでuser_pathの引数として指定できます。
httpメソッドとは
httpリクエストは私たちが自分のPCでWebブラウザからリソース(ファイル)があるサーバーへする要求のことです。
要求にも何種類かあるのでそれをメソッドで指定します。
httpリクエストのメソッドは下記のような種類があります。
項目 | 意味 |
---|---|
get | リソースを取得する。サイトを閲覧する時に利用する。 |
post | リソースを保存する。 |
delete | リソースを削除する。 |
patch | リソースを更新する。 |
CRUD
アプリには基本となるリソースの操作が下記の4種類に分けることができます。
- 作成:Create
- 表示:Read
- 更新:Update
- 削除:Destroy
これらそれぞれの頭文字を取ってCRUDと呼ばれています。
railsで作成するアプリも、このCRUDが基本となります。
CRUDは上の4種類のhttpメソッドを使って要求をします。
いつrake routesコマンドを使うのか
rake routesコマンドは主にリンクを作成する時に使用します。
例えば詳細ページへのリンクを貼りたい場合、showアクションを動かしたいですよね。
ではshowアクションを動かすパスは何になるでしょうか?
routes.rbをみてもresourcesメソッドを使って定義した場合、確認することができません。
ですので「rake rotues」コマンドを実行してそれを調べるわけです。
実際のアプリでrake routesコマンドを使ってみよう
それでは実際にアプリの中でrake routesコマンドを使ってみましょう。
下記のコマンドを順に実行してみましょう。
①git clone -b rake_routes https://github.com/miyagit/programan_dojo.git
② cd programan_dojo
③ bundle install
→ rbenv: version ‘2.4.1’ is not installed と表示された場合は、ruby -v と実行してください。
ruby -vと実行し出てきたversion(例: 2.3.1)と出てきたら、
vim .ruby-versionとし、
ruby -vで出てきた値(例: 2.3.1)に書き換えてください。
続いてvim Gemfileとし、ruby 2.4.1と書いてある部分をruby -vで出てきた値(例: 2.3.1)に書き換えてください。
④ rails db:create && rails db:migrate && rails db:seed
環境構築が完了しました。と表示されると、
本当にrails applicationが動作するかrails sコマンドで起動しましょう。
rails sを起動し、ブラウザでlocalhost: 3000と入力して下記のような画面が出てくれば環境構築完了です!
routes.rbを確認しよう
rake routesコマンドを使う前に現在どういうルーティングが定義されているのか「config/routes.rb」を開き、確認してみましょう。
1
2
3
4
Rails.application.routes.draw do
root 'main#top'
resources :users
end
現在はこういう記述になっていることが確認できます。
では実際に「rake routes」コマンドでルーティングを確認してみましょう。
1
2
3
4
5
6
7
8
9
10
Prefix Verb URI Pattern Controller#Action
root GET / main#top
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
現在はこのようなルーティングになっていることが確認できました。
それではこれを参考にユーザーの詳細ページへ進むリンクを作成してみましょう。
それにはusersコントローラーのshowアクションを動かせば良さそうです。
それにはどのパスを指定してあげれば良いでしょうか?
まずは一番右から「users#show」を探しましょう。
「#」の左がコントローラー名、右がアクション名でしたね。
「users#show」のURI Patternはどうなっているでしょうか?
「/users/:id(.:format) 」となっているのが確認できます。
(.:format)とは、formatオプションで、html形式やjson形式、pdf形式といった複数の形式で出力することを表しています。
なのでパスには含まれません。
「:id」の部分はuserのidを指定してあげます。
ですのでshowアクションへのパスは下記のようになります。
1
<%= link_to "詳細ページ", "/users/#{user.id}" %>
Prefixを使って書くと下記のようになります。
1
<%= link_to "詳細ページ", user_path('userのidが入ったインスタンス') %>
このように「rake routes」コマンドはリンク先のパスを確認する時に使うと覚えておきましょう!
「rake routes」コマンドはroutes.rbで定義したルーティングをターミナルで確認するためのコマンドです。