変数の定義はどこで?(パシャール編)
変数の定義先はどこ?
パーシャルファイル内に記載された、このコードの意味がわからなかった。
【_follow_button.html.erb】
<% unless current_user == user %>
概要としては、「current_userがuserではない時...」ということなんだろうけど、current_userとuserはどこで定義しているのだろうか。
current_user
これはSessionsHelper内で定義していた。
module SessoionsHelper
def current_user
@current_user || = User.find_by(id: session[:user_id])
end
session管理されたuser_idを使い、ユーザー情報を取得するメソッドが書かれていた。
要はログインするユーザー情報を取得する変数のようだ。
user
そしてuserはrenderで読み込むときにuserを定義していた。
【app/view/users/show.html.erb】(一部抜粋)
<%= render "relationships/follow_button", user: @user %>
「renderでrelationshipsディレクトリ(フォルダ)内の_folllow_buttonファイルを読み込む際、変数userは@userと同じ扱いだよ」と記述していたではないか。
そして、このファイルはusers/show.html.erbなので、UsersControllerのshowアクション経由で表示されている。つまり、そこを見ればuser変数の内容が見れるということだ。
users#show
def show
#DBのidからUserを検索し、@user変数に代入
@user = User.find(params[:id])
end
まとめ
ということでパーシャル内の@が付いていない変数は、他の場所で定義されていることがわかった。今回でいうとパーシャルファイル内で出てきた@無しの変数(user)は、renderで読み込む際に定義されているはずなので、そこを注目してみよう。