Railsでルーティングを作成!ネストやパラメーターを取得する方法も解説!

8 min
Railsでルーティングを作成!-ネストやパラメーターを-取得する方法も解説!

Railsでのルーティングの作成方法がいまいち理解出来てなくて、毎回新しいページを作るたびに悩んでしまいます。Railsの開発でよく使うルーティングの書き方を一通り紹介してもらことは出来ますか?

こんな悩みを解決していきます。

本記事の内容
  • Railsのルーティング作成方法の基本を紹介
  • URLパラメーターを持つURLの定義方法を紹介
  • ネストされたルーティングの作成方法を紹介

Ruby On Railsのプロジェクトを新規で作成すると大量のファイルやディレクトリ(フォルダ)が生成されます。

そのため新規でページを作成しようとしても、どのファイルをどの様に変更して行くのか分からず躓いてしまう方がとても多いです。

そこで今回の記事では新規でページを作成する際に必要なルーティングの部分に特化した内容を、コード付きで解説します。

パラメーターをURLに含めるパスパラメーターの定義方法や、ネストしたルーティングの作成方法についても解説をするので、これを機会にルーティングの基本的な定義方法を理解しましょう。

動作確認環境

今回のコードは下記のバージョンで動作確認したものとなります。
バージョンが大きく異なると動かない可能性があるのでご注意ください。

動作確認環境
  • ruby 2.7.1
  • Rails 6.0.3.4

記事を執筆している時点(2020-12-26)での最新バージョンは6.1.0です。
6.0.3と比較してルーティング周りの変更点は特にありませんが、差分などが気になる方は公式サイトをご確認ください。

Ruby On Rails公式サイ

ルーティングを記述するファイルの場所

Railsではルーティングに関するファイルは app/config/routes.rb に記載をしていきます。

app/config/routes.rb


Rails.application.routes.draw do
  # この中にルーティングを記述する。
end

Scaffoldで生成されるルーティングを確認

実務では全くと言って使うことが無いScaffoldですが、簡単な動作確認を行いたいときには地味に便利なので今回も動作確認のために活用していきます。

Scaffoldコマンドは実行すると大量のファイルが生成されるので、この記事をご覧のみなさんはコマンドは実行せずに結果を見て必要そうな部分だけを真似るようにしましょう。
(動作確認や検証のために作成したRailsプロジェクトであれば実行して頂いても問題ないです)

今回は動作確認のためにUsersに関するファイル群を生成しました。

Terminal


$ rails generate scaffold user name:string age:integer

--------------- 以下実行結果 ---------------

Running via Spring preloader in process 37005
      invoke  active_record
      create    db/migrate/20201226075637_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      create      test/system/users_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

scaffoldコマンドの実行が完了すると、config.rbにusersのルーティングが追加され、http://localhost:3000/users にアクセスをするとユーザーの一覧画面が表示出来るようになります。

app/config/routes.rb


Rails.application.routes.draw do
  resources :users
end
Rails - ユーザーの一覧画面

resourcesを使ったルーティング

Scaffoldコマンドを実行するとresources: usersroutes.rbに追記されました。

resourcesメソッドを活用する事で下記の様なRESTful APIの設計に則った形のルーティングが生成されます。

Terminal


$ bundle exec rails routes

--------------- 以下実行結果 ---------------

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

作成されたそれぞれのルーティングの役割は下記。

resourcesによって生成されるルーティング一覧
HTTPメソッドURL役割
GET/usersユーザーの一覧ページの表示
POST/usersユーザー作成
GET/users/newユーザー作成ページの表示
GET/users/:id/editユーザー編集ページの表示
GET/users/:idユーザー詳細ページの表示
PATCH/users:idユーザー更新
PUT/users/:idユーザー更新
DELETE/users/:idユーザー削除

resourceメソッドによって生成されたルーティングは、下記のRESTfulAPIについての記事を参照する事で理解が深まると思います。

翻訳: WebAPI 設計のベストプラクティス

only・exceptでresourcesのルーティングを制御

resourcesを活用することで8つのルーティングを生成してくれますが、これら全てのルーティングを活用することは殆どありません。

言い換えるとresourcesメソッドを活用するだけだと、使われることがない無駄なroutingが作成され残ってしまいます。

そこで必要なルーティングだけを作成するために「only」と「except」を使用します。

onlyで特定のルーティングだけを作成する

例えばusersのルーティングの中で「index」と「show」だけを使う場合、ルーティングの定義を下記のようにしましょう。

app/config/routes.rb


Rails.application.routes.draw do
  resources :users, only: [:index, :show]
end

そうすると、今まで8つのルーティングが生成されていたのが指定したルーティングのみを生成するようになります。

Terminal


$ bundle exec rails routes

--------------- 以下実行結果 ---------------

users     GET    /users(.:format)          users#index
user      GET    /users/:id(.:format)      users#show

exceptで特定のルーティング以外を作成する

resourcesで生成されるルーティングを殆ど利用したいけど、どれか1つだけは不要という場合もあると思います。

その様な場合に7つをonlyで指定するのは冗長なのでexceptを活用します。

app/config/routes.rb


Rails.application.routes.draw do
  resources :users, except: [:index, :show]
end

ルーティングを変更後はroutesコマンドで生成されているリストを確認すると、上記で指定したindexとshow以外のルーティングが生成されています。

Terminal


$ bundle exec rails routes

--------------- 以下実行結果 ---------------

users     POST   /users(.:format)          users#create
new_user  GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
user      PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

exceptは指定したルーティングだけを除外して生成する事が出来ますが、その結果どのようなルーティングが生成されるかは、routesコマンドを確認しないと分かりづらいという問題があります。
そのため余程の理由がない限りはonlyを使い、必要なルーティングだけを生成するようにしましょう。

URLパラメーターを受け取るルーティングの書き方

URLの中にidなどのパラメーターを含めたい場合があると思います。

以下はusersテーブルのidをURLに含めてController側で受け取ることを想定した記述です。

app/config/routes.rb


Rails.application.routes.draw do
  get "users/:id"  => "users#show"
end

上記の様なルーティングを定義することで、 http://localhost/users/1 のようなURLにアクセスをすると1がidとして代入され、controller側で受け取ることが出来ます。

以下はshowメソッドの中で puts params を実行し、paramsで渡ってきている値を表示した結果になります。

Terminal


{"controller"=>"users", "action"=>"show", "id"=>"1"}

パラメーターを複数受け取りたい場合は、下記のようにする事で受け取れます。
以下は http://localhost/users/1/2 にアクセスする事を想定したルーティングと、controller側で受け取ったparamsの結果です。 

app/config/routes.rb


Rails.application.routes.draw do
  get "users/:id/:test_id"  => "users#show"
end

Terminal


{"controller"=>"users", "action"=>"show", "id"=>"1", "test_id"=>"2"}

この様にURLにパラメーターを受け取ることは非常に簡単に出来るのでこれを機会に是非マスターしておきましょう。

また今回は変数名として test_id という名称を使っていますが、実際に開発をする際にはどの様な値を表しているかが明確にわかる命名にしましょう。

ネスト(入れ子)になっているルーティングの書き方

続いてネストされている場合のルーティングの書き方についてです。

例えば http://localhost:3000/posts/1/comments/1 の様な、特定の投稿に紐づくコメント詳細用のルーティングを生成したいとします。

その様な場合は下記のように記述することが可能です。

app/config/routes.rb


Rails.application.routes.draw do
  resources :posts do
    resources :comments
  end
end

ちなみに上記の記述だと、無駄なルーティングも生成されてしまうので、適宜onlyなどを活用して必要なルーティングだけを生成するようにしましょう。

app/config/routes.rb


Rails.application.routes.draw do
  resources :posts, only: :show do
    resources :comments, only: :show
  end
end

rootの設定方法

最後にrootの設定方法を紹介します。

rootとは/にアクセスした場合のルーティングで、ローカル環境などではhttp://localhost:3000/ がこれに相当します。

Railsのデフォルト設定ではWelcomeページが初期設定でされています。

Rails Welcome Page

今回はUserの一覧画面をrootに設定する場合の例を紹介します。

Title


Rails.application.routes.draw do
  root "users#index"
en

rootの設定はとてもシンプルで、かつほぼ全てのサービスで利用する物なので覚えておきましょう。

Railsのルーティング設定は難しくはない

Railsで新しいページを表示するためのルーティング設定は、routes.rbのファイルに1行追加するだけで大抵が実現可能です。

resourcesを使うことによって無駄なルーティングが生成されてしまうという点だけに注意をして、ルーティングの設定を行っていきましょう。

Sponsored Link
himakuro

himakuro

新卒で入社したブラック企業から脱出して超ホワイトな会社に転職。エンジニア歴は7年で普段はウェブサービス作ったりブログを書いたり、MENTAで未経験者の方にプログラミングを指導しています。

カテゴリー:
関連記事

コメントを残す