こんにちは。あがさんです!!
見様見真似でRuby on Railsの学習をしています。
Railsガイドやチュートリアルが丁寧に教えてくれるので、分からない点があってもなんとなくアプリケーションが出来上がってしまいます。(凄い!けどなんとなくは良くない)
今回はRailsでアプリケーション開発をしていた際に、苦手意識を持っていたroutes.rbと
親の顔よりも見たlocalhost:3000/rails/info/routesのページについて触れていきます。
ルーティング とは
Ruby on Railsにおいて、アプリケーション内のURLをコントローラのアクションに結びつける仕組みのことです。config/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
class UsersController < ApplicationController
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
end
↓ 下の図はRailsアプリ起動時にアクセスできるルーティングが確認出来るページです。エラーのとき赤くなって画面に飛び込んでくるのを何かも経験しました...。
見ていただきたいのは2段目、3段目の#indexアクションと#showアクションのルーティングです。
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データを全て取得してページに表示するように動作します。
次のユーザー詳細へアクセスする際も同じ考え方となります。
get 'users/:id', to: 'users#show'
となるので
localhost:3000/usersの後にそれぞれのid(図の場合はuser_id: 1)をつけたlocalhost:3000/users/1
にアクセスするとusers_controller.rbのshowアクションが発火して、下記の図のようにuser_id: 1を持つユーザーの詳細ページへ遷移するように動作します。
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'
へ
変更してみました。
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"変更されていることが確認できます。
実際にlocalhost:3000/chikawa
で動作することができました。
localhost:3000/chikawa/1
も同様ですね。
root と 名前付きルートのすすめ
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というルーティングヘルパーが付与されてコードに組み込み安くなります。
名前付きルート : root_path以外に自分独自で命名できるルーティングヘルパーを名前付きルート(Named Route)と呼びます。get'users/:id', to: 'users#show'
の後ろに, as: "character"
と追記することでusers/:id
の代わりにcharacter
という表記でコードを書くことができます
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アクションのページ戻ることができます。
<%= link_to "Back to Top", root_path %> # root_pathを使用してTopへ戻る
<%= link_to "Back to Top", home_path %> # 名前付きルートを使用してTopへ戻る
注意)自由にルートパスをネーミングをしてしまうと共同開発をしている人たちに混乱を与えてしまうかも知れないので、ネームミングには分かりやすさと配慮を心がけましょう。
便利な resources
Rails.application.routes.draw do
# Root path to index action
root 'users#index'
resources :users
end
Railsにはresources :users
と書くだけでよしなにルーティングを組んでくれる機能があります。とても便利です。下のRotesの表ように一般的なCRUD処理にも対応できるようルーティングが割り振られています。
※注意点)「とりあえずresources :users
と書いておけば良いんやろぉ!?」と済ませてしまう人は後でルーティングエラーに陥ります!!(はい。...何を隠そうこの私です‼️‼️)
resources
を定義したらどんなルーティングになっているか自分自信で把握しながら、routes.rbを作成していくというのが正しい向き合い方だと痛感しました。
まとめ
いかがでしたでしょうか。
Railsは設定より規約(convention over configuration)を重んじるフレームワークです。今までroutes.rbの定義が理解できておらず、ルーティングエラーに悩んでいました。今回振り返る機会がとれて大変よかったです。
routes.rbをしっかり定義することで、アプリ全体のルーティング管理が容易にできることがわかりました。
まだまだ奥深いルーティング定義ですが引き続き理解を深めていきたいと思います。
ここまで読んでいただきありがとうございました〜
次回もどうぞよろしくお願いします!!
~Qiitaの歴史がまた1ページ~