【Rails入門】ルーティング (config/routes.rb)の書き方を説明!

Railsにはルーティング(routes)という、とても便利な機能があります。

しかしルーティングは、今までフレームワークに触れたことがない方にとっては、理解しにくい機能でもあります。

そこで今回は、

  • ルーティングってなに?
  • ルーティングってどんなことをしているの?
  • resources行の動作がイマイチわからない。
  • ルーティングをもっと簡単に確認する方法はない?

という方のために、Railsのルーティングについて以下の順に解説します。

  • ルーティングを設定するとは
  • ルーティングの定義方法
  • resources行の書きかた
  • ルーティングの確認方法

ルーティングを設定するとは

ルーティングは、ブラウザから届いたリクエスト(HTTPメソッド+URL)に対して、コントローラーで定義したアクションを結びつける機能です。

分からない言葉だらけで戸惑うと思いますので、少し具体的にかつザックリ説明すると、以下の表のような動作を設定することをルーティングを設定すると言います。

リクエスト呼び出されるアクション
HTTPメソッド「GET」+URL「http://localhost:3000/photos/1」photosコントローラーのshowアクション
HTTPメソッド「GET」+URL「http://localhost:3000/photos/17」photosコントローラーのshowアクション
HTTPメソッド「DELETE」+URL「http://localhost:3000/photos/17」photosコントローラーのdestroyアクション

2行目と3行目のURLが同じですが、呼び出されるアクションが異なります。Railsに限らず、「HTTPメソッド」を利用するWebアプリでは、総じてこのような仕組みになっています。

Webアプリを開発したことがない人からすると、同じURLなのに、showアクションが呼ばれたり、destroyアクションが呼ばれたりするのは、不思議ですよね。

ルーティングを理解するためのWebアプリを作成する

ルーティングの動作を理解するために、scaffoldを使ってWebアプリを作っておきましょう。scaffoldの使い方は、以下の記事で解説していますので、ぜひご覧ください。

【Rails入門】初めてのWebアプリ開発ならscaffoldが最短!
更新日 : 2018年8月21日

この記事では、以下のコマンドでWebアプリを作成した場合を例に、説明を続けます。

scaffoldは、ルーティングに限らず、Railsの基本的な動作を理解するための環境として非常に優れていますね。

RESTfulなルーティングを設定する

動作確認用のWebアプリができましたので、ルーティングの設定方法を説明しましょう。scaffoldで作成したWebアプリでは、config/routes.rbに以下のようなルーティングが設定されています。

この記事の最後でも紹介していますが、Railsサーバーを起動して、ブラウザで「http://localhost:3000/rails/info/routes」にアクセスすると、上のconfig/routes.rbの内容で設定されているルーティングを確認できます。

rails-routes01

この表の1行目(赤枠部分)からは、HTTPメソッド「GET」+「http://localhost:3000/photos」で、photosコントローラーのindexアクションが呼び出されることを読み取れます。

また、5行目と8行目から、同じ「http://localhost:3000/photos/1」でも、HTTPメソッドが「GET」ならphotosコントローラーのshowアクションが呼び出され、HTTPメソッドが「DELETE」ならphotosコントローラーのdestroyアクションが呼び出されることが読み取れます。

ルーティングの確認方法がわかったところで、設定方法を説明します。

一括設定

簡単な記載で、複数行のルーティング設定を一括設定できます。綴りが非常に似ている2種類の書きかたがありますので、注意が必要です。

resources(複数)

scaffoldで作成したWebアプリのconfig/routes.rbに書かれているように、「resources」は8行分のルーティング設定を一括設定する、とても便利な書きかたでした。

たとえば写真のように同じ形式のデータを複数登録するようなデータ構造では、「resources」を使うと良いでしょう。resourcesの使いかたや、resourcesをネストする方法は、以下の記事でも紹介していますので、ぜひご覧ください。

【Rails入門】resourcesの使い方まとめ
更新日 : 2019年5月17日

resource(単数)

次に紹介する「resource」は7行分のルーティング設定を一括設定する、こちらも便利な書きかたです。

ブラウザで「http://localhost:3000/rails/info/routes」にアクセスしてみましょう。

rails-routes02

resourcesと比較して、ルーティング設定が1行減っただけではなく、「Path」欄から「:id」が取り除かれていますね。ユーザーの情報(自分1つ)だけを管理するようなデータ構造で、「resource :user」を使うことが想定されています。

個別設定

ルーティングを一括設定する方法を紹介しましたが、1行ずつ設定することもできます。

config/routes.rbを以下のように修正して、ブラウザで「http://localhost:3000/rails/info/routes」にアクセスしてみましょう。

以下のように1行だけになりましたね。

rails-routes03

この書きかたで初期設定のconfig/routes.rbと同じルーティングを設定するには、以下のように書くことになります。

「resources :photos」は、上記の内容をすべて記載するのと同じ意味をもつということですね。

せっかくですから、個別設定について1行ずつ見ていきましょう。

get

getは、HTTPメソッド「GET」に対応する書きかたです。

  • get ‘photos’:HTTPメソッド「GET」+URL「http://localhost:3000/photos」のリクエストを条件とする
  • to: ‘photos#index’:photosコントローラーのindexアクションを呼び出す


indexアクションやshowアクションのように、情報を表示するだけの(データを更新しない)アクションは、HTTPメソッド「GET」を使用します。いくつかの行に書かれている「as: ‘new_photo’」のような記述は、「new_photo_path」のようなヘルパーを設定しています。

post

postは、HTTPメソッド「POST」に対応する書きかたです。

  • post ‘photos’:HTTPメソッド「POST」+URL「http://localhost:3000/photos」のリクエストを条件とする
  • to: ‘photos#create’:photosコントローラーのcreateアクションを呼び出す


createアクションのように、データを新規登録するアクションは、HTTPメソッド「POST」を使用します。

patch、put

patchはHTTPメソッド「PATCH」に対応し、putはHTTPメソッド「PUT」に対応する書きかたです。

  • patch ‘photos/:id’:HTTPメソッド「PATCH」+URL「http://localhost:3000/photos/1」のリクエストを条件とする
  • to: ‘photos#update’:photosコントローラーのupdateアクションを呼び出す


updateアクションのように、データを更新するアクションは、HTTPメソッド「PATCH」または「PUT」を使用します。

patchとputのどちらを使うか迷った場合は、Railsで推奨されているpatchを使用しましょう。

delete

deleteは、HTTPメソッド「DELETE」に対応する書きかたです。

  • delete ‘photos/:id’:HTTPメソッド「DELETE」+URL「http://localhost:3000/photos/1」のリクエストを条件とする
  • to: ‘photos#destroy’:photosコントローラーのdestroyアクションを呼び出す


destroyアクションのように、データを削除するアクションは、HTTPメソッド「DELETE」を使用します。

match

matchは、HTTPメソッドが異なるが、パスが同じ場合に便利な書きかたです。

  • match ‘photos’とvia: [:get, :post]:HTTPメソッド「GET」+URL「http://localhost:3000/photos」と、HTTPメソッド「POST」+URL「http://localhost:3000/photos」のリクエストを条件とする
  • to: ‘photos#show’:photosコントローラーのshowアクションを呼び出す

高度な設定

次は、conf/routes.rbの高度な設定方法を見てみましょう。

名前空間(namespace、scope)

パスとコントローラーの名前空間をあわせて設定する場合は、以下のようにnamespaceを使います。

ブラウザで「http://localhost:3000/rails/info/routes」にアクセスしてみましょう。

rails-routes04

パスに「/admin」が追加され、さらにコントローラー#アクションに「admin/」が追加されていますね。一方、パスの名前空間のみを設定する場合は、scopeを使います。

ブラウザで「http://localhost:3000/rails/info/routes」にアクセスしてみましょう。

rails-routes05

パスにのみ「/admin」が追加されていますね。

他方、コントローラー#アクションにのみ「admin/」を追加する方法も用意されています。この場合は、scope module:を使用します。

ブラウザで「http://localhost:3000/rails/info/routes」にアクセスしてみましょう。

rails-routes06

確かにコントローラー#アクションに「admin/」が設定されていますね!

resources/resourceにルーティング設定を追加する(member、collection)

resourcesに、「/photos/:id/preview」のルーティングを追加する例を紹介します。

もちろんresourceにも同様の構文で追加できます。

ブラウザで「http://localhost:3000/rails/info/routes」にアクセスしてみましょう。

rails-routes07

1行目(赤枠部分)が追加されたルーティング設定です。memberを指定して追加したため、パスに「:id」を含んでいます。collectionを指定して追加すると、パスに「:id」は含まれません。

resources/resourceのルーティング設定を制限する(only:、except:)

8行(resourceの場合は7行)のルーティング設定のうち、一部だけを作成する場合は、only:オプションやexcept:オプションを指定します。

ブラウザで「http://localhost:3000/rails/info/routes」にアクセスしてみましょう。

rails-routes08

1~2行目が、:users, only: [:index, :show]で作成されたルーティングで、確かにusers#indexとusers#showだけが作成されていますね。

3行目以降は、:photos, except: [:destroy, :update]で作成されたルーティングで、こちらはphotos#destroyとphotos#updateが作成されていません。

RESTfulではないルーティングを設定する

RESTfulではないルーティングも設定できます。

リダイレクト(redirect)

以下のように設定すると、/membersを/usersにリダイレクトできます。

2行目のようにパラメータも、リダイレクト先のパスで利用できます。

ルーティングの確認方法

ルーティングを正しく設定したつもりでも、何か誤りがあるかもしれません。

Webアプリがどのようにルーティングを認識しているかを確認しましょう。

rake routesコマンド

準備がいらない、もっとも基本的なやり方です。

(1)「端末」を起動し、「cd app/samurai/routes-sample/」と入力して、Enterキーを押します。

(2)「bin/rails routes」と入力し、Enterキーを押します。

Webアプリが認識しているルーティングが表示されます。

コマンドを実行するたびにRailsを読み込むため、動作が少し遅いのが欠点です。

show-routesコマンド

Railsコンソールでshow-routesコマンドを利用する方法です。

(1)Gemfileを編集します。

以下の場所に「gem ‘pry-rails’」を追記します。

変更前:

変更後:

(2)「bundle install」と入力し、Enterキーを押します。

「pry-rails」がインストールされます。

参考:https://github.com/rweng/pry-rails

(3)以下のコマンドを1行ずつ順番に入力します。

Webアプリが認識しているルーティングが表示されます。

この方法では、Railsコンソールを起動するときにRailsを読み込んでいるため、素早くルーティングを表示できます。

ブラウザ(http://localhost:3000/rails/info)

Railsサーバーを起動して、「http://localhost:3000/rails/info」にアクセスすると、ルーティングを確認できます。

rails-routes02

ルーティングを設定する際は、Railsサーバーと動作確認用ブラウザを起動しておくと、とても便利です。

まとめ

今回はRailsのルーティング(routes)について解説しました。ルーティングは、設定したつもりでも設定できていなかったり、名前を間違えたり、エラーの原因となることが多いです。

config/routes.rbを編集したら、必ず確認しましょう!

現役フリーランスエンジニアによる無料体験レッスン実施中!

もし、あなたが、

  • 経験、年齢、学歴に不安がある
  • 挫折しない学習方法が知りたい
  • アプリ開発で困っている
  • エンジニアの”生”の声が聞きたい!
  • 仕事獲得の仕方がわからない
  • エンジニアに転職したいが何をすればいいかわからない

など、プログラミング学習やキャリアのことでお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_mtm3

LINEで送る
Pocket

書いた人

侍テック編集部

侍テック編集部

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説