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.rbにusersのルーティングが追加され、http://localhost:3000/users にアクセスをするとユーザーの一覧画面が表示出来るようになります。
app/config/routes.rb
Rails.application.routes.draw do
resources :users
end
resourcesを使ったルーティング
Scaffoldコマンドを実行するとresources: usersがroutes.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が作成され残ってしまいます。
そこで必要なルーティングだけを作成するために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
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ページが初期設定でされています。
今回はUserの一覧画面をrootに設定する場合の例を紹介します。
Title
Rails.application.routes.draw do
root "users#index"
en
rootの設定はとてもシンプルで、かつほぼ全てのサービスで利用する物なので覚えておきましょう。
Railsのルーティング設定は難しくはない
Railsで新しいページを表示するためのルーティング設定は、routes.rbのファイルに1行追加するだけで大抵が実現可能です。
resourcesを使うことによって無駄なルーティングが生成されてしまうという点だけに注意をして、ルーティングの設定を行っていきましょう。
- Ruby初心者に向けた学習ロードマップ!挫折しないための学習方法!
- 【初心者向け】MacでRailsを使えるようにするための環境構築方法を徹底解説!
- 【初心者向け】RailsでMySQLを使うための手順をコマンド付きで解説!
- Railsが難しい理由を現役エンジニアが解説!学習効率を上げるには○○を高めるべき!
- Rails初心者に向けたコマンドまとめ!newやgenerateコマンド、簡単に使える便利関数を紹介!
- Railsでルーティングを作成!ネストやパラメーターを取得する方法も解説!
- Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!
- Railsでリンクヘルパー(link_to)を使ってサクッとリンクを生成する方法を解説!