変数の取り扱いで、「@」を頭に付けるべきか不要なのか判断に迷うことが増えてきました。
先輩から聞いた説明がとても明快で、つまづきがひとつ解消。
忘れないうちに以下にまとめておきます。
ローカル変数
・頭に何もつかない。
・メソッドで定義したスコープ(def〜end)の中でだけ使える。
def morikuma
user = User.find_by(id: params[:id])
end
※定義の内容はあくまで一例です。
インスタンス変数
・@が頭につく。
・インスタンス変数のスコープはメソッド定義内に限定されない。
→スコープの範囲外や、ファイルが変わっても使える。
def morikuma
@user = User.find_by(id: params[:id])
end
※定義の内容はあくまで一例です。
検証
実際に、インスタンス変数で定義されて正常に動いているコードをローカル変数に変更して検証してみました。
<正常に機能している記述>
def index
@users = User.all
end
〜
<% @users.each do |user| %>
〜
〜
<% end %>
〜
@usersで定義されているインスタンス変数を、ローカル変数に変えてみます。
<検証用に変更した記述>
def index
users = User.all
end
〜
<% users.each do |user| %>
〜
〜
<% end %>
〜
undefined local variable or method 'users'
「users」というメソッドが定義されていないよとエラーが出ました。
ローカル変数はあくまで、定義したスコープの範囲内でしか適用されないことが確認できました。
別のファイルで呼び出そうとしても「undefined」となります。
参考サイト
progate
https://prog-8.com/
Ruby のエラーメッセージを読み解く(初心者向け)その 2
https://qiita.com/scivola/items/77017693de371ab49667
Ruby 変数のスコープ
https://qiita.com/kansiho/items/f5ab9b6eeb990e6af327
RubyLife インスタンス変数
https://www.rubylife.jp/ini/class/index4.html