0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ルーティングは極力ルーティングヘルパーを使おう

Posted at

この記事はプログラミング学習者がアプリ開発中に躓いた内容を備忘録として記事におこしたものです。内容に不備などあればご指摘頂けると助かります。

記事投稿の背景

この記事ではアプリ制作中に分かったview側でのルート指定の方法やそれぞれのルーティングのメリット・デメリットをご紹介していきます。

ルート指定の方法

以下の資料はRailsで閲覧できるルーティングのリストです。

docker compose exec web bin/rails routes
docker compose exec web bin/rails routes
                                  Prefix Verb     URI Pattern                                                                                       Controller#Action
                              home_index GET      /home/index(.:format)                                                                             home#index
                                    root GET      /                                                                                                 home#index
                             follow_user POST     /users/:id/follow(.:format)                                                                       users#follow
                           unfollow_user DELETE   /users/:id/unfollow(.:format)                                                                     users#unfollow
                               edit_user GET      /users/:id/edit(.:format)                                                                         users#edit
                                    user GET      /users/:id(.:format)                                                                              users#show
                                         PATCH    /users/:id(.:format)                                                                              users#update
                                         PUT      /users/:id(.:format)                                                                              users#update                                            

ルート指定には2つの方法があります。

  • URLを直接指定してルートを設定する
    例:/users/:id/follow
    メリット:ブラウザのURL欄に表示される内容と同じ記法なので直感的で分かり易い
    デメリット:URLを手動で管理する必要がある為、メンテナンス性が悪い
  • ルーティングヘルパーを使ってルートを設定する
    例:/users/tweet.user.id/follow
    メリット:URLの変更が合った場合でも自動的にルーティングヘルパーが対応してくれるのでメンテナンス性が高い
    デメリット:慣れるまではヘルパーを見ただけでは何のアクションか判断し辛い

ルーティングヘルパーを使った方がいい理由

  • メンテナンス性
    URLの変更が起こっても自動的にヘルパーが対応してくれる
  • オブジェクトからidを拾ってくれるのでコードが冗長にならない
    例:/users/#{tweet.user.id}/follow
    とすることでURLを直接入力してもルーティングは可能です。
    一方でルーティングヘルパーを使った場合、
    例:follow_user_path(tweet.user)と書くことができます。
    これらURLを使った書き方とルーティングヘルパーを使った書き方で記法は違いますが、結果は同じ内容になります。
    ルーティングヘルパーを使った場合、URLの記法と違ってidを渡す書き方を必要としません。
    オブジェクトを渡すことで(例ではtweet.user)、Railsが自動的にオブジェクトからidを取得してくれます。
    また、idの記述を省けるのでコードも簡潔になります。
    悪い例としてfollow_user_path(id: tweet.user.id)を挙げておきます。
    これは私のルーティングヘルパーへの理解度が低い時に書いたコードです。
    ルーティングヘルパーを使っているので、idをオブジェクトから拾ってくれるのにわざわざ冗長な書き方をしています。

以上の理由から極力ルーティングヘルパーを使うのが好ましいと考えられます。

ルーティングヘルパーを使えない場合はこうやろう

一つのコントローラー内で複数のアクションを使おうとするとルーティングヘルパーが表示されないことがあります。
以下は表示されない時の例です。
スクリーンショット 2024-10-10 21.31.41.png
updateアクション2つ(PATACHとPUT)とdestroyアクションに関しては左側にルーティングヘルパーが表示されていません。
これは複数のルーティングでヘルパーにすべき名前が衝突してしまった場合は1つだけしか作られないからです。
update,destroyアクションでもuser_pathを使いたいけど、既にshowアクションで使われているので、他のアクションには割り当てることができません。

このような場合、解決策が2つ挙げられます。

  • 1, カスタムルーティングを設定する
routes.rb
resources :users do
  member do
    post 'follow'
    delete 'unfollow'
  end
end

member doを加えることで/users/:id/follow/users/:id/unfollowに対してルートが動作するようにできます。
この書き方をすることでuser_pathというルーティングヘルパーを使わずに代わりにfollow_user_pathunfollow_user_pathといったヘルパーを自動生成できます。
これにより名前が重複することによってルーティングヘルパーが表示されていなかったアクションに対してヘルパーを割り当てることができるようになります。
以下はルーティングヘルパーが表示された時のルート一覧の抜粋です。
スクリーンショット 2024-10-11 6.31.38.png

  • 2, 名前付きルートを使う
routes.rb
post '/users/:id/follow', to: 'users#follow', as: 'follow_user'
delete '/users/:id/unfollow', to: 'users#unfollow', as: 'unfollow_user'

名前付きルート(as:オプション)を使うことで、特定のルートに対して独自の名前を定義でき、その名前に基づいたルーティングヘルパーを生成できます。
上の例でもカスタムルーティングの時と同様にfollow_user_pathunfollow_user_pathというルーティングヘルパーが生成されます。

以上でルーティングヘルパーに関して説明を終わらせて頂きます。
最後まで読んで頂きありがとうございました。

今回参考にした資料

【初学者向け】_urlや_pathといったヘルパーメソッドの使い方

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?