👻

インスタンス変数・ローカル変数

2023/10/07に公開

デイリースクラム内にて、「インスタンス変数とローカル変数ってどっち使うかわからなくなる時がある」という話がでたので一度簡単に復習しようと思います。

インスタンス変数

インスタンス変数とはコントローラーアクションとViewファイルでデータの受け渡しができる変数のこのこと。
変数名の頭に@をつけることによりインスタンス変数となります。例:@user@bookなど

インスタンス変数の特徴は、コントローラのアクション内で定義をし、それから対応するViewに渡すことができます。アクション内で値を設定すれば、その値はViewで利用できます。
たとえば、本の投稿の詳細画面を作成する場合

app/controllers/books_controller.rb
class BooksController < ApplicationController
  def show
    # 本の情報を取得しインスタンス変数に入る。
    @book = Book.find(params[:id]) 
  end
end

上記の例では、@bookの中に本の情報が入っています。このインスタンス変数はshowアクションで定義され対応するViewへ渡されます。

app/views/books/show.html.erb
<h2>タイトル</h2>
<p><%= @book.title %></p>
・
・

Viewファイル内では、インスタンス変数@bookに代入された本の情報を表示することができます。

ローカル変数

ローカル変数とは、インスタンス変数の逆でコントローラーとViewファイルでデータの受け渡しができない変数のことです。インスタンス変数とは違い、変数名の先頭に何も付けない場合はローカル変数となります。

app/controllers/books_controller.rb
・
・
def destroy
  book = Book.find(params[:id])  # データ(レコード)を1件取得
  book.destroy  # データ(レコード)を削除
  redirect_to '/books'  # 投稿一覧画面へリダイレクト  
end
・
・

上記のように投稿データを削除する場合等では、アクション内にてローカル変数のbookを代入し削除しています。

↑こちらはまた別の機会にて…

インスタンス変数・ローカル変数の違い

それぞれの特徴をざっくりとまとめると

インスタンス変数

  • 変数の名前の先頭に@マークをつける
  • コントローラーとViewでデータの受け渡しができる

ローカル変数

  • 変数の名前の先頭には何もつけない
  • コントローラーとViewでデータの受け渡しができない

以上

参考

https://zenn.dev/ganmo3/articles/58c1f44fa50831

Discussion