👻
インスタンス変数・ローカル変数
デイリースクラム内にて、「インスタンス変数とローカル変数ってどっち使うかわからなくなる時がある」という話がでたので一度簡単に復習しようと思います。
インスタンス変数
インスタンス変数とはコントローラーアクションと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でデータの受け渡しができない
以上
参考
Discussion