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?

【Rails初学者】パーシャルにはインスタンス変数ではなくローカル変数を渡せ🫡

Posted at

結論

パーシャルに変数を渡すときはインスタンス変数(@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_aizen_01.jpg
参考:BLEACH 20巻より

図解で理解する

図解でイメージを掴みたいと思います!

パーシャルにインスタンス変数が渡されたとき😟

partial-before.png

  • @userインスタンス変数しか使えず、authoradminなど他のユーザー情報を表示したい場合に対応できず、せっかくパーシャルに切り出したのに再利用性が低いですね😭

パーシャルにローカル変数が渡されたとき😊

partial-after.png

  • userローカル変数を使うことで、@user@admin@authorなど様々なユーザー情報を渡せて、パーシャルの再利用性が高まります🙌

なぜローカル変数を使うべきなのか?

1. 再利用性が高まる

ローカル変数を使うことで、パーシャルは特定のインスタンス変数に依存しなくなります。
これにより、同じパーシャルを異なるコンテキストで再利用でき、コードの重複を避けることができます!
パーシャルの目的が「共通部分の切り出し」であるため、インスタンス変数を渡してしまうと、その目的が損なわれてしまいます😢

2. 依存関係が明確になる

ローカル変数を使うことで、パーシャルがどのデータに依存しているかが明確になります!
例えば、userというローカル変数を渡すことで、そのパーシャルがユーザー情報に依存していることが一目で分かります。
一方、インスタンス変数を使うと、パーシャルの中身を見ないと依存関係が分からず、コードの可読性が低下します😵

<!-- インスタンス変数を使うケース -->
<%= render '_card' %>

<!-- ローカル変数を使うケース -->
<%= render '_card', locals: { user: @user } %>

コードを読むうえでこのパーシャルはuserが必要だと一目でわかり、可読性もあがります📈

3. キャッシュが正しく動作する

インスタンス変数やcurrent_userなどをパーシャル内で直接使うと、データの依存関係が曖昧でどこからデータが来ているか分からなくなり、古いデータが表示されるなどのバグの原因になります。
「必要なデータはすべて渡す」 というルールを守ることで、これらを未然に防ぎ、キャッシュがより確実に効くようになります。

正直ちょっとこの部分は理解しきれていないのですが、参考記事によると、ローカル変数を使うことでキャッシュの依存関係が明確になり、キャッシュの整合性が保たれるとのことです🧐

参考:Rails: ビューのパーシャルではローカル変数だけを使うこと(翻訳)より

参考記事

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?