読んで欲しい人
- パーシャルにインスタンス変数を書いてエラーになった人
- 過去の自分
動作環境
- MacOS 14.5
- ruby 3.3.0
- Rails 7.1.3.3
- psql (PostgreSQL) 14.11
課題
- 下記のコードにレビューをいただいた
_post.html.haml
# パーシャルファイル
.p-4.d-flex.flex-column.justify-content-center.mt-6
.post-container.p-3
.mb-3
= @user.name
レビュー内容: パーシャルでインスタンス変数をつかわないように
なぜダメか
理由1
そもそもパーシャルの利用目的は、
viewの一部を切り出して、再利用するためのもの
なので、
インスタンス変数をパーシャルの中で使用してしまうと、他の部分で再利用ができない。
理由2
キャッシュの効率が悪い
Railsではパーシャルを呼び出すタイミング(render)で、キャッシュを生成してくれています。
- キャッシュとは(ざっくり)
よく使用するデータを保存して、すぐに使用できるようにしたもの。
今回の場合は、パーシャルの内容をキャッシュとして保存してくれる。
キャッシュを作成するにはキャッシュキーが必要になるが、
インスタンス変数だと毎度その値が違うため、キャッシュとして保存しても実際は違うビューが表示されたりする。
効率が悪い
解決方法
- このパーシャルを利用するファイルで、ローカル変数を定義する
- ローカル変数に対して、インスタンス変数を渡してあげる
= render 'post', post: @post
学び・感想
- ダメなのは知っていたが、なぜか?までは知らなかったので理解できて良かった
- 何度も注意されているので気をつけたい
参考記事