この記事はプログラミング学習者がアプリ開発中に躓いた内容を備忘録として記事におこしたものです。内容に不備などあればご指摘頂けると助かります。
記事投稿の背景
この記事ではアプリ制作中に分かったview側でのルート指定の方法やそれぞれのルーティングのメリット・デメリットをご紹介していきます。
ルート指定の方法
以下の資料はRailsで閲覧できるルーティングのリストです。
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
をオブジェクトから拾ってくれるのにわざわざ冗長な書き方をしています。
以上の理由から極力ルーティングヘルパーを使うのが好ましいと考えられます。
ルーティングヘルパーを使えない場合はこうやろう
一つのコントローラー内で複数のアクションを使おうとするとルーティングヘルパーが表示されないことがあります。
以下は表示されない時の例です。
update
アクション2つ(PATACHとPUT)とdestroy
アクションに関しては左側にルーティングヘルパーが表示されていません。
これは複数のルーティングでヘルパーにすべき名前が衝突してしまった場合は1つだけしか作られないからです。
update
,destroy
アクションでもuser_path
を使いたいけど、既にshow
アクションで使われているので、他のアクションには割り当てることができません。
このような場合、解決策が2つ挙げられます。
- 1, カスタムルーティングを設定する
resources :users do
member do
post 'follow'
delete 'unfollow'
end
end
member do
を加えることで/users/:id/follow
や/users/:id/unfollow
に対してルートが動作するようにできます。
この書き方をすることでuser_path
というルーティングヘルパーを使わずに代わりにfollow_user_path
やunfollow_user_path
といったヘルパーを自動生成できます。
これにより名前が重複することによってルーティングヘルパーが表示されていなかったアクションに対してヘルパーを割り当てることができるようになります。
以下はルーティングヘルパーが表示された時のルート一覧の抜粋です。
- 2, 名前付きルートを使う
post '/users/:id/follow', to: 'users#follow', as: 'follow_user'
delete '/users/:id/unfollow', to: 'users#unfollow', as: 'unfollow_user'
名前付きルート(as:
オプション)を使うことで、特定のルートに対して独自の名前を定義でき、その名前に基づいたルーティングヘルパーを生成できます。
上の例でもカスタムルーティングの時と同様にfollow_user_path
やunfollow_user_path
というルーティングヘルパーが生成されます。
以上でルーティングヘルパーに関して説明を終わらせて頂きます。
最後まで読んで頂きありがとうございました。