Ruby On Rails PR

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

Railsでルーティングを作成!-ネストやパラメーターを-取得する方法も解説!
記事内に商品プロモーションを含む場合があります

Ruby On Railsでプロジェクトを作成すると非常に多くのファイルやディレクトリが生成され、どのファイルを変更して開発を進めて行くべきなのか悩む方も多いと思います。

そこで今回の記事では新規ページ作成に必要なルーティングの部分に焦点を当て、コード例を交えて具体的に解説します。

新規ページを作成する際によく遭遇する問題、例えばURLパラメーターを含むURLの定義やネストされたルーティングの作成方法についてもコード付きで解説します。

今回の記事を参考にルーティングの基本をしっかりと理解し、Rails開発をスムーズに進めて行きましょう。

動作確認環境

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

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

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

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

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.rbusersのルーティングが追加され、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についての記事を参照する事で理解が深まると思います。

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

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

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

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

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

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

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コマンドで生成されているリストを確認すると、上記で指定したindexshow以外のルーティングが生成されています。

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にアクセスをすると1idとして代入され、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を使うことによって無駄なルーティングが生成されてしまうという点だけに注意をして、ルーティングの設定を行っていきましょう。

 

 

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