0
0

【Ruby on Rails】ルーティングで困ったroutes.rbについて振り返ってみる

Posted at

こんにちは。あがさんです!!

見様見真似でRuby on Railsの学習をしています。
Railsガイドやチュートリアルが丁寧に教えてくれるので、分からない点があってもなんとなくアプリケーションが出来上がってしまいます。(凄い!けどなんとなくは良くない)

今回はRailsでアプリケーション開発をしていた際に、苦手意識を持っていたroutes.rbと
親の顔よりも見たlocalhost:3000/rails/info/routesのページについて触れていきます。

ルーティング とは

Ruby on Railsにおいて、アプリケーション内のURLをコントローラのアクションに結びつける仕組みのことです。config/routes.rbファイルで定義します。
下記は簡単なroutes.rbのファイルです。

routes.rb
Rails.application.routes.draw do
  # CRUD routes without using resources
  get    'users',           to: 'users#index'
  get    'users/:id',      to: 'users#show'
end
users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
  end
  def show
    @user = User.find(params[:id])
  end
end

↓ 下の図はRailsアプリ起動時にアクセスできるルーティングが確認出来るページです。エラーのとき赤くなって画面に飛び込んでくるのを何かも経験しました...。
見ていただきたいのは2段目、3段目の#indexアクションと#showアクションのルーティングです。
スクリーンショット 2024-08-31 15.10.17.png

routes.rbで定義した通りにこのRoutesページにも記載されていますよね!
自分はルーティングに迷った場合はこのページを見ながら問題箇所を直しています。

デモページで確認

簡単なユーザー登録ページを作りました。ユーザー一覧とユーザー詳細の2ページがあります。
まずget '特定のURL', to: 'コントローラー#アクション'がルーティングの基本の型になります。
get'users',to: 'users#index'であれば、usersにアクセスするとusersのURLにGETリクエストが送信され、RailsはUsersControllerのindexアクションを実行します。

このデモページだと、localhost:3000の後に/usersをつけたlocalhost:3000/usersにアクセスするとusers_controller.rbのindexアクションが発火して、下記の図のようにUserデータを全て取得してページに表示するように動作します。

スクリーンショット 2024-08-31 15.07.18.png

次のユーザー詳細へアクセスする際も同じ考え方となります。
get 'users/:id', to: 'users#show'となるので
localhost:3000/usersの後にそれぞれのid(図の場合はuser_id: 1)をつけたlocalhost:3000/users/1にアクセスするとusers_controller.rbのshowアクションが発火して、下記の図のようにuser_id: 1を持つユーザーの詳細ページへ遷移するように動作します。

スクリーンショット 2024-08-31 15.28.15.png

URLのパスを変更する

routes.rbではモデルやコントローラと同じ名称でURLを作ることが多いかと思います。
ただサービス内容やイメージに対して、URLのパスがあまりに素っ気ないということもあるかも知れません。
そんな時はroutes.rbのファイル内でURLのパスを変更できます。
get 'users', to: 'users#index'からget 'chikawa', to: 'users#index'
get 'chikawa/:id', to: 'users#show'からget 'chikawa/:id', to: 'users#show'
変更してみました。

routes.rb
Rails.application.routes.draw do
  # Root path to index action
  root 'users#index'
  # CRUD routes without using resources
  get    'chikawa',          to: 'users#index',   as: 'home'
  get    'chikawa/:id',      to: 'users#show',    as: 'character'

end

"/users"の部分が"chikawa"変更されていることが確認できます。
スクリーンショット 2024-08-31 14.32.13.png


実際にlocalhost:3000/chikawaで動作することができました。
スクリーンショット 2024-08-31 14.30.51.png


localhost:3000/chikawa/1も同様ですね。
スクリーンショット 2024-08-31 15.30.07.png

root と 名前付きルートのすすめ

routes.rb
Rails.application.routes.draw do
    root 'pages#index'

  get    'users',           to: 'users#index', as: "home"
  get    'users/:id',      to: 'users#show', as: "character"
end

root : いわゆるサービスのTOPページにしたいページ(アクション)を割り当て出来る機能です。localhost:3000/にアクセスするとデフォルトではRuby on Railsのロゴのページが表示されるように設定されています。
ここで上記のようにroot 'pages#index'と記述をするとlocalhost:3000/にアクセスするとindexアクションのページが表示されるようになります。

またroot_pathというルーティングヘルパーが付与されてコードに組み込み安くなります。

スクリーンショット 2024-08-31 14.32.13.png

名前付きルート : root_path以外に自分独自で命名できるルーティングヘルパーを名前付きルート(Named Route)と呼びます。get'users/:id', to: 'users#show' の後ろに, as: "character"と追記することでusers/:idの代わりにcharacterという表記でコードを書くことができます

routes.rb
Rails.application.routes.draw do
    root 'pages#index'

  get    'users',           to: 'users#index', as: "home"
  get    'users/:id',      to: 'users#show', as: "character"
end

↓どちらも同じようにindexアクションのページ戻ることができます。

show.html.erb
<%= link_to "Back to Top", root_path %> # root_pathを使用してTopへ戻る

<%= link_to "Back to Top", home_path %> # 名前付きルートを使用してTopへ戻る

注意)自由にルートパスをネーミングをしてしまうと共同開発をしている人たちに混乱を与えてしまうかも知れないので、ネームミングには分かりやすさと配慮を心がけましょう。

便利な resources

routes.rb
Rails.application.routes.draw do
  # Root path to index action
  root 'users#index'

  resources :users
end

Railsにはresources :usersと書くだけでよしなにルーティングを組んでくれる機能があります。とても便利です。下のRotesの表ように一般的なCRUD処理にも対応できるようルーティングが割り振られています。

スクリーンショット 2024-08-31 15.13.22.png

※注意点)「とりあえずresources :usersと書いておけば良いんやろぉ!?」と済ませてしまう人は後でルーティングエラーに陥ります!!(はい。...何を隠そうこの私です‼️‼️)
resourcesを定義したらどんなルーティングになっているか自分自信で把握しながら、routes.rbを作成していくというのが正しい向き合い方だと痛感しました。

まとめ

いかがでしたでしょうか。

Railsは設定より規約(convention over configuration)を重んじるフレームワークです。今までroutes.rbの定義が理解できておらず、ルーティングエラーに悩んでいました。今回振り返る機会がとれて大変よかったです。

routes.rbをしっかり定義することで、アプリ全体のルーティング管理が容易にできることがわかりました。
まだまだ奥深いルーティング定義ですが引き続き理解を深めていきたいと思います。

ここまで読んでいただきありがとうございました〜
次回もどうぞよろしくお願いします!!

~Qiitaの歴史がまた1ページ~

参考文献
Ruby on Rails ガイド
Ruby on Rails チュートリアル

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0