• Home
  • Ruby on RailsのルーティングとRESTfulルート

Ruby on RailsのルーティングとRESTfulルート

記事のサムネイル

Railsでは、アプリケーション内の異なるURLにリクエストをマッピングするためにルーティングが使われています。

その中でも、RESTfulなルーティングはRailsの中核的な概念であり、効率的でシンプルなURL構造を提供しています。

この記事では、RailsのルーティングとRESTfulなルートについて詳しく解説します。

ルーティングの基本

Railsのルーティングはconfig/routes.rbファイルに記載します。

記載する内容としては、HTTPメソッドとURLパス、そしてそれに対応するコントローラーのアクションを記載します。

例えば、下記のように書くことで特定のURLにリクエストをルーティングすることができます。

# config/routes.rb
Rails.application.routes.draw do
  get '/products', to: 'products#index'
  post '/products', to: 'products#create'
  get '/products/:id', to: 'products#show'
  put '/products/:id', to: 'products#update'
  delete '/products/:id', to: 'products#destroy'
end

上記の例では/productsに対して、GETリクエストがProductsControllerのindexアクションに、POSTリクエストがcreateアクションにマッピングされています。

また、/products/:idのようなパスは動的セグメントと呼ばれ、:idには異なる値を入れることができます。

RESTfulルーティング

RESTの性質を持っているルート設計のことをRESTfulと言います。Railsのルート設計はこのRESTfulとなります。
※ RESTfulでないルート設計も可能にはなります。しかしRailsにはRESTfulなルート設計が前提の機能も存在するため、注意が必要となります。

RESTfulなルーティングでは、リソース指向のURLを定義することが一般的となっています。

これにより、CRUD操作(Create, Read, Update, Delete)に対応する標準的なHTTPメソッドであるGET・POST・PATCH・PUT・DELETEを使用できます。

例えば下記のようにresourcesメソッドを使用すると

# config/routes.rb
Rails.application.routes.draw do
  resources :articles
end

以下のようなRESTfulなルーティングが自動的に定義されます

     articles GET    /articles(.:format)           articles#index
              POST   /articles(.:format)           articles#create
  new_article GET    /articles/new(.:format)       articles#new
 edit_article GET    /articles/:id/edit(.:format)  articles#edit
      article GET    /articles/:id(.:format)       articles#show
              PATCH  /articles/:id(.:format)       articles#update
              PUT    /articles/:id(.:format)       articles#update
              DELETE /articles/:id(.:format)       articles#destroy

ヘルパーメソッド

RESTfulなルーティングでは、ルートヘルパーメソッドも自動的に生成されます。これらのヘルパーメソッドを使うと、コントローラー内やビューで簡潔にURLを生成することができます。

ルートヘルパーメソッド

ルートヘルパーメソッドは、ルートURLへのパスを生成するためのメソッドになります。

これにより、URLを直接記述する代わりに、ルート名を使用してリンクを作成することができます。

例えば、下記でrouteを生成した場合は

# config/routes.rb
Rails.application.routes.draw do
  resources :articles
end

articles_pathnew_article_path等のルートヘルパーメソッドが自動的に生成されます。

_pathと_urlについて

ルートヘルパーメソッドを使うにあたってPrefix+_pathPrefix+_urlがあります。

違いとしては_pathがルート以下の文字列を返すのに対して、_urlはドメインを含む完全なURLを返すという違いがあります。

  root_path => '/' ※ルート以下の文字列を返す
  root_url  => 'https://example.com/' ※完全なURLの文字列を返す

  articles_path => '/articles'
  articles_url  => 'https://example.com/articles'

_pathと_urlの使い分けですが、「リダイレクトするときは_urlを使用する。それ以外は_pathを使う」とするとよさそうです。

リンクヘルパーメソッド

リンクヘルパーメソッドは、指定したURLやルート名に基づいてリンクを作成するためのメソッドになります。

これにより、簡単にリンクを生成することができます。

<%= link_to 'Show Articles', articles_path(@article) %>
<%= link_to 'Edit Article', edit_article_path(@article) %>
<%= link_to 'Delete Article', articles_path(@article), method: :delete, data: { confirm: 'Are you sure?' } %>

そのほか、フォームヘルパーメソッドやテキストヘルパーメソッド等ありますが、今回の趣旨とは異なるので説明省略します。

ルートの名前付け

ルーティングに名前を付けることで、ルートヘルパーのメソッド名が変わります。これにより、ルートをより意味のある名前で参照することができます。

# config/routes.rb
Rails.application.routes.draw do
  resources :products, path: 'items', as: 'items'
end

これにより、以下のようなルートヘルパーが使えるようになります。

  • items_path
  • items_url
  • item_path(@item)
    items GET    /items(.:format)              products#index
          POST   /items(.:format)              products#create
 new_item GET    /items/new(.:format)          products#new
edit_item GET    /items/:id/edit(.:format)     products#edit
     item GET    /items/:id(.:format)          products#show
          PATCH  /items/:id(.:format)          products#update
          PUT    /items/:id(.:format)          products#update
          DELETE /items/:id(.:format)          products#destroy

実装やエラーが解決できない場合

プログラミングの実装やエラーでどうしてもわからない場合はメンターに相談するのが一番です。

考えている、見えている範囲が狭くなり、解決から遠くに行って何時間も、何日も経っていることなんてよくある話です。

そういう時は聞ける先輩や、メンターに相談することが大事です。

僕にも相談可能なので気軽に相談してください。

ご相談はこちら
(Twitterのプロフィールへ飛びます)

OTHER ARTICLES

  • Web制作

  • Rails

railsでjsではなくrubyでtooltipの単位を設定するときの話

2024/08/20
  • Web制作

  • Rails

Railsにおけるクラスメソッドとインスタンスメソッドの違いについて

2024/05/30
  • Web制作

  • Docker

  • Rails

DockerでRails7 + PostgreSQL + esbuildの環境を構築する方法

2024/05/16
  • Web制作

  • Rails

  • Docker

Dockerで建てたrails7環境で「undefined method `devise' for 〜」が発生した話

2024/05/16
  • Web制作

  • Rails

Ruby on RailsのルーティングとRESTfulルート

2024/05/09
  • Web制作

  • Rails

Ruby on Railsにおけるresourceとresourcesの違い

2024/05/01
管理者のイメージ画像

PROFILE

Youta

山口県出身の現役のWebエンジニアです。仕事を通して学んだことや、生活していく中で学んだことを発信していきます。

CATEGORY