結論
パーシャルに変数を渡すときはインスタンス変数(@usersなど)ではなく、ローカル変数(usersなど)を使え
Bad😱
<!-- app/views/users/show.html.erb(呼び出し元) -->
<%= render 'card' %>
<!-- app/views/users/_card.html.erb(パーシャル、呼び出し先) -->
<div class="card">
<h3><%= @user.name %></h3>
<p><%= @user.email %></p>
</div>
Good☺️
<!-- app/views/users/show.html.erb(呼び出し元) -->
<%= render 'card', locals: { user: @user } %>
<!-- app/views/users/_card.html.erb(パーシャル、呼び出し先) -->
<div class="card">
<h3><%= user.name %></h3>
<p><%= user.email %></p>
</div>
はじめに
すいません、タイトルに強い言葉を使ってしまいました。
しかし、パーシャルにインスタンス変数を使うと後々困ることが多いので、この記事でその理由を説明したいと思います🙋

参考:BLEACH 20巻より
図解で理解する
図解でイメージを掴みたいと思います!
パーシャルにインスタンス変数が渡されたとき😟
-
@userインスタンス変数しか使えず、authorやadminなど他のユーザー情報を表示したい場合に対応できず、せっかくパーシャルに切り出したのに再利用性が低いですね😭
パーシャルにローカル変数が渡されたとき😊
-
userローカル変数を使うことで、@userや@admin、@authorなど様々なユーザー情報を渡せて、パーシャルの再利用性が高まります🙌
なぜローカル変数を使うべきなのか?
1. 再利用性が高まる
ローカル変数を使うことで、パーシャルは特定のインスタンス変数に依存しなくなります。
これにより、同じパーシャルを異なるコンテキストで再利用でき、コードの重複を避けることができます!
パーシャルの目的が「共通部分の切り出し」であるため、インスタンス変数を渡してしまうと、その目的が損なわれてしまいます😢
2. 依存関係が明確になる
ローカル変数を使うことで、パーシャルがどのデータに依存しているかが明確になります!
例えば、userというローカル変数を渡すことで、そのパーシャルがユーザー情報に依存していることが一目で分かります。
一方、インスタンス変数を使うと、パーシャルの中身を見ないと依存関係が分からず、コードの可読性が低下します😵
<!-- インスタンス変数を使うケース -->
<%= render '_card' %>
<!-- ローカル変数を使うケース -->
<%= render '_card', locals: { user: @user } %>
コードを読むうえでこのパーシャルはuserが必要だと一目でわかり、可読性もあがります📈
3. キャッシュが正しく動作する
インスタンス変数やcurrent_userなどをパーシャル内で直接使うと、データの依存関係が曖昧でどこからデータが来ているか分からなくなり、古いデータが表示されるなどのバグの原因になります。
「必要なデータはすべて渡す」 というルールを守ることで、これらを未然に防ぎ、キャッシュがより確実に効くようになります。
正直ちょっとこの部分は理解しきれていないのですが、参考記事によると、ローカル変数を使うことでキャッシュの依存関係が明確になり、キャッシュの整合性が保たれるとのことです🧐
参考:Rails: ビューのパーシャルではローカル変数だけを使うこと(翻訳)より
参考記事

