【Rails】rake routesコマンドを徹底解説!

Rails

rake routesコマンドとは

routes.rbで定義したルーティングをターミナルで確認することができるコマンドです。

いつ使うのか

ルーティングをresourcesメソッドを使って定義した場合、各アクションのルーティングを確認することができません。
そんなときに「rake routes」コマンドを使用します。

下記のようなルーティングを設定していたとします。

ruby
1
2
3
Rails.application.routes.draw do
    resources :tweets
end

これだとルーティングの詳細が確認できませんね。
この時ターミナルで「rake rotues」コマンドを実行すると下記の出力結果がターミナルに表示されます。

shell
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」を開き、確認してみましょう。

ruby
1
2
3
4
Rails.application.routes.draw do
  root 'main#top'
  resources :users
end

現在はこういう記述になっていることが確認できます。
では実際に「rake routes」コマンドでルーティングを確認してみましょう。

shell
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アクションへのパスは下記のようになります。

erb
1
<%= link_to "詳細ページ", "/users/#{user.id}" %>

Prefixを使って書くと下記のようになります。

erb
1
<%= link_to "詳細ページ", user_path('userのidが入ったインスタンス') %>

このように「rake routes」コマンドはリンク先のパスを確認する時に使うと覚えておきましょう!

まとめ

「rake routes」コマンドはroutes.rbで定義したルーティングをターミナルで確認するためのコマンドです。