プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】ルーティングについての知識(config/routes.rb…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Ruby on Rails】ルーティングについての知識(config/routes.rb、collection、memberなど)

11.28

  • miyabisan2
  • コメントを書く

この記事は4分で読めます

ルーティングとは?

どのURLへどのHTTPメソッドでアクセスされたらどのコントローラやアクションを呼び出したいか設定することです。

config/routes.rbについて

Railsにおいてルーティングの設定をするファイルになります。「rails g controller モデル名」というコントローラーの自動生成コマンドを実行したら自動的にルーティングの設定をこのファイルに書き込んでくれます。

ただ、rails g controllerで生成される自動設定は最低限まずアプリとして動く状態の設定に過ぎず、適切なアプリケーション設定は開発者自身が行う必要があります。しっかりと書き方を理解して実装できるようになりましょう。

config/routes.rbを構造化するための記述方法

scope

オプションを色々指定することでブロック内の定義に一定の制約をかけます。通常の利用であればコントローラのフォルダ構成を変えずにURLを変更することができます。

例

1
2
3
scope :admin do
  resources :tasks
end

生成されるルーティング

1
GETで「/admin/tasks/new」に「tasks#new」

scopeのオプション

:pathオプション

URL階層

:moduleオプション

モジュール、詳しくは下記の段落で解説しています。

:asオプション

URLパータン名のプリフィックス

scopeのmoduleオプションについて

moduleを使うことでURLを変えずにコントローラーのフォルダ構成を変更することが可能です。

例

下記例では「controller/admin/TaskController.rb」というフォルダ分けになる。

1
2
3
scope module: :admin do
  resources :tasks
end

生成されるルーティング

URLとしては通常のルーティングと何ら変わりません。

1
GETで「/tasks/new」に「tasks#new」

namespace

URL階層、モジュール、URLパターン名のプリフィックスにまとめて制約をかけます。つまりscopeと比較してコントローラのフォルダ構成を変えつつ、URLを変更することが可能です。scopeと違いどこかのオプションだけ制約をかけるということはできません。

例

1
2
3
4
namespace :admin do
  root ‘tasks#index’
  get ‘about’, to: ‘tasks#show’
end

生成されるルーティング

1
2
「/admin」が「ルートURL」
「/admin/about」が「tasksコントローラ」の「showアクション」を指す。

controller

コントローラを指定します。

config/routes.rbをうまく整理するコツ

アプリの機能が増えてくるとroutes.rbの内容がだんだん見にくくなってきてしまいます。それでも見やすさを保つためにはコントローラ単位で整理すると綺麗に整理することができます。URLがどうなっているかよりは機能単位(コントローラー単位)でどういう構造になっているかがわかる方が直感的にルーティング情報を理解できます。具体的には下記のように整理するようにしましょう。

1
2
3
4
5
6
7
8
Rails.application.routes.draw do
  controller :コントローラA do
    コントローラAのルーティング情報
  end
  controller :コントローラB do
    コントローラBのルーティング情報
  end
end

config/routes.rbで記述する内容のパターン

get 'users/index'

usersコントローラのindexアクションにGETリクエストをする。アクセスさせるURL(http://○○/users)と呼ぶコントローラが一致している場合はこのように記述すると良いでしょう。上記は省略系であり下記のように書き換えることが可能です。

1
get 'users/index', to: 'users#index'

get 'users' to:パス(users#index等)

アクセスさせるURL(http://○○/users)と呼ぶコントローラのインデックスをの紐付けを変えたい場合はこのように省略せずに記述すると良いでしょう。

 root to: パス(users#index等)

アプリの玄関口(http://localhost:3000)に表示されるページを指定する。パスを指定する場合はパスの区切りはスラッシュではなく#になるので注意です。

resources  :リソース名(users等)

全てのアクションに関するルーティングを一括で設定してくれる。一発で7つのアクションに対応する7つのルートを定義できます。

:onlyオプション

resourcesの中のアクションの対象を絞ってルーティングを設定する。

:exceptオプション

resourcesの中のアクションの対象を除外してルーティングを設定する。

resourcesのデフォルトのルーティング(7つのアクションが自動で作られる。下記はuserというモデルの場合)

機能 HTTPメソッド URLパターン URLパターン名 ヘルパーメソッド アクション
一覧 GET /users users users_path index
詳細 GET /users/:id user users_path show
新規登録 GET /users/new new_user new_user_path new
登録 POST /users users users_path create
編集画面 GET /users/:id/edit edit_user edit_user_path edit
更新 PATCHまたはPUT /users/:id user user_path update
削除 DELETE /users/:id user user_path destroy

ちなみに、上記のルーティング設定はREST-APIの基本形にもなります。RESTは下記でも解説しています。

【Web開発】「REST-API(RESTful)」とは?

resourcesの入れ子(リレーション関係のあるルーティング)

1
2
3
  resources :親 do
    resources :子
  end

そうすると下記のような親子関係のあるルーティングが出来ます。テーブル間でリレーションを貼った場合とかでは選択肢として入るでしょう。

1
2
3
4
5
6
7
8
         親_子 GET    /親/:親_id/子(.:format)                                                親#index
                          POST   /親/:親_id/子(.:format)                                                親#create
      new_親_子 GET    /親/:親_id/子/new(.:format)                                            親#new
     edit_親_子 GET    /親/:親_id/子/:id/edit(.:format)                                       親#edit
          親_子 GET    /親/:親_id/子/:id(.:format)                                            親#show
                          PATCH  /親/:親_id/子/:id(.:format)                                            親#update
                          PUT    /親/:親_id/子/:id(.:format)                                            親#update
                          DELETE /親/:親_id/子/:id(.:format)                                            親#destroy

match

複数のメソッドを同じURLに紐づけることが可能です。

例

1
2
match ‘/about’, to: ‘task#index’,via: [:get,:post]
match ‘/about’, to: ‘task#index’,via: :all(全てのアクションに紐付ける、正直あまり使う機会はない)

REST以外の独自のアクションをルーティングで使いたい場合はcollection(集合)とmember(個別)を利用する必要があります。

collection

idなしのURLに対してルーティング情報を追加でいきます。(自動で追加される7つのルーティング情報以外に追加します。)

通常の例

記述方法

1
2
3
4
5
6
7
resources :admin do
  #全データを対象とする場合(つまり「:id」をURLにつけない。)
  collection do
    post: search1
    post: search2
  end
end

生成されるルーティング

1
2
POSTで「/admin/search1」に「admin#search1」
POSTで「/admin/search2」に「admin#search2」

collectionの簡易表記例

collectionを使わずに記述すると下記のようになります。

1
2
3
resoucers : users do
  post :another, action: :another_new,on : :new
end

on: :追加したいアクション

ルーティングURLを追加したいアクションを追加します。

下記のようなルーティングが生成されています。newの下階層に追加されています。

1
another_new_user POST   /users/new/another(.:format)   users#another_new

member

特定のデータ(:id)に対してURLを生成したい場合に使います。

例

1
2
3
4
5
6
7
resources :admin do
  #特定のデータを対象とする場合(つまり「:id」をURLにつける。)
  member do
    get: getdata1
    get: getdata2
  end
end

生成されるルーティング

1
2
GETで「/admin/1(任意)/search1」に「admin#getdata1」
GETで「/admin/1(任意)/search2」に「admin#getdata2」

スポンサーリンク
  • 2019 11.28
  • miyabisan2
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 12.02

    【Ruby on Rails】エラー処理の概要

  2. 2019 12.14

    【VSCode】Railsのデバッグ設定(Mac)

  3. 2020 12.12

    【Ruby on Rails】「プレゼンター(デコレーター)」について

  4. 2019 12.30

    【Rspec】「Controller Spec(コントローラスペック)」の基本

  5. 2019 12.03

    【Ruby on Rails】アセットパイプラインについて

  6. 2018 06.19

    【Ruby on Rails】YAMLの基本と、データベースの接続設定をするには?

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Ruby on Rails】RailsにBootst…

【Ruby on Rails】パーシャルを使ったビュー…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー