🛣️

🔰 Railsルーティングの基本:users_pathとuser_pathの違い

2024/11/28に公開

はじめに

Railsアプリケーションを開発していると、「なぜ生成されるURLが変わるのか?」と疑問に思うことがあります。その中でも特によくあるのが、users_pathとuser_pathの使い方の違いです。

今回は、この2つのヘルパーメソッドを例にして、URLがどのように生成されるかを解説します。

users_pathuser_pathの基本的な役割

まず、Railsではresources :usersといった形でルーティングを設定していることを前提に話を進めます。この設定によって、以下のようなルートヘルパーが自動的に生成されます。

  • users_path

    • ユーザーの「一覧ページ」のURLを生成します
    • 例: /users
    • 主にindexアクションに対応しています。
  • user_path(@user)

    • 特定のユーザーの「詳細ページ」のURLを生成します。
    • 例: /users/1
    • 主にshowアクションに対応しています。

生成されるURLの違い

例えば、以下のパンくずリストを生成するコードの一部で確認してみましょう。

# 例1: users_path
add_breadcrumbs(name: @user.name, path: users_path(@user))

# 例2: user_path
add_breadcrumbs(name: @user.name, path: user_path(@user))

例1: users_path(@user)

users_pathは本来「一覧ページ」を指すものですが、引数として@userを渡しています。この場合、Railsは@userを無理矢理URLの一部として扱い以下のような不自然なURLを生成します。

http://127.0.0.1:3000/users.1

これはusers_pathの不適切な使い方です。❌

例2: user_path(@user)

user_path(@user)は「特定のユーザー」を指すための正しいヘルパーメソッドです。@userのidをURLに埋め込んで、以下のような期待通りのURLを生成します。

http://127.0.0.1:3000/users/1

これはusers_pathの適切な使い方です。⭕️

間違いの原因と解決法

users_pathuser_pathの違いを理解していないと、users_path(@user)のような間違いが発生して不自然なURLが生成されてしまいます。

正しい使い分け

ユーザー一覧ページへのリンクを生成する場合

users_path

特定のユーザーの詳細ページへのリンクを生成する場合

user_path(@user)

まとめ

Railsのルーティングヘルパーは便利ですが、それぞれの役割を正しく理解しないと意図しないURLが生成されることがあります。特にusers_pathuser_pathのように似た名前のヘルパーメソッドを使うときは注意が必要です。

  • users_path -> ユーザーの一覧(index) -> 一覧で複数形のため「s」が付く
  • user_path -> 特定のユーザーの詳細(show) -> 特定のユーザーをを指しているため単数形

参考

https://railsguides.jp/routing.html

https://pikawaka.com/rails/gretel

Discussion