teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/07/19 17:38

投稿

web_inago
web_inago

スコア74

answer CHANGED
@@ -1,1 +1,48 @@
1
- パーシャルではuserが何なのかわからないので@userがuserですと教えています
1
+ パーシャルではuserが何なのかわからないので@userがuserですと教えています
2
+
3
+ ##追記
4
+
5
+ **>なぜパーシャルだけはuserが何かわからないんですか?**
6
+ userという変数はどこにも定義されていないからです。
7
+
8
+ **>それならパーシャルは@userのことはわかるみたい何ですが**
9
+ **>パーシャルは何がわからなくて何がわかるんですか?**
10
+ 定義され、受け渡されている変数だけがわかる(扱えます)
11
+
12
+ @userはインスタンス変数なので、controllerからテンプレートへ渡っています。
13
+ なのでこれはパーシャルからも扱えます。
14
+ userはローカル変数なので、それが何なのかを示してあげないといけません。
15
+
16
+ なぜパーシャルからもインスタンス変数を参照できるのにわざわざローカル変数に代入しているのか説明します
17
+
18
+ ```users
19
+ <% @users.each do |user| %>
20
+ <%= user.name %>
21
+ <% end %>
22
+ ```
23
+ 上記のようにインスタンス変数をパーシャルで扱ってしまうと、
24
+ 同じ表示で、値だけ@postsを参照したものを実装したい時に
25
+ ```posts
26
+ <% @posts.each do |post| %>
27
+ <%= post.name %>
28
+ <% end %>
29
+ ```
30
+ 上記のような@posts専用のパーシャルをもう一つ作る必要があります。
31
+ これではパーシャルにして使いまわしをする、ということができず、
32
+ 単純にコードをファイル分割しただけになります。
33
+
34
+ そこで以下のようにパーシャルではインスタンス変数ではなくローカル変数を参照するようにすると、
35
+
36
+ ```index
37
+ <% items.each do |item| %>
38
+ <%= item.name %>
39
+ <% end %>
40
+ ```
41
+ @usersを扱いたい時も、@postsを扱いたい時も、@animalsを扱いたい時も、
42
+ パーシャルの記述はそのままで、
43
+ render時に
44
+ ```ここに言語を入力
45
+ <%= render 'index', items: @posts %>
46
+ <%= render 'index', items: @users %>
47
+ ```
48
+ として、ローカル変数に扱いたいインスタンス変数を代入するだけで一つのパーシャルを使いまわせます。