【Rails】インスタンス変数 @xxx とは何かを学ぼう

当サイトでは一部リンクに広告が含まれています
アイキャッチ

プログラミング言語RubyとそのWebフレームワークであるRuby on Railsを学ぶ際、いきなり様々な変数の概念を学ぶはずです。

特に、インスタンス変数は非常に重要で、頻繁に使用されます。

しかし、インスタンスとは何かをよく理解しないまま、インスタンス変数を扱おうとして沼にハマる方をよく見かけます。

この記事では、インスタンス変数が一体何なのか、そしてRuby on Railsでどのように使用されるのかを、初心者の方でも理解できるように説明していきます。

前提となる必須知識も解説していますので、少し冗長に感じるかもしれませんがしっかりおさえておきましょう!

目次

前提知識:Rubyの変数の種類

Rubyでは、変数に関して以下の4つの主要な種類が存在します。
それぞれの変数は、プログラミングの中で重要な役割を果たし、使用する場所や目的に応じて選びます。

ローカル変数

ローカル変数は特定のメソッドやブロック内のみで利用可能な変数です。

例:

def example_method
  local_variable = "I'm local variable"
  puts local_variable
end

この例では、example_method メソッド内でローカル変数を定義しています。

この変数はメソッド内だけで使えるローカル変数として定義されているため、外部から呼び出すことはできません。

グローバル変数

グローバル変数はどこからでも参照・変更可能な変数で、$ で始まる記号が特徴です。

例:

$global_variable = "I'm global variable"

def example_method
  puts $global_variable
end

ここでは、$global_variable はどこからでも参照できるので、メソッド内からでもその値を取得することができます。

クラス変数

クラス変数は特定のクラス全体で共有される変数で、 @@ で始まります。

例:

class MyClass
  @@class_variable = "I'm class variable"

  def self.display_variable
    puts @@class_variable
  end
end

この例では、MyClass の中でクラス変数を定義して、その値を表示するメソッドを作りました。

インスタンス変数

インスタンス変数はあるオブジェクト(インスタンス)専用の変数で、 @ で始まります。
これは、オブジェクト指向プログラミングで一般的に使用され、オブジェクトの属性を保持します。

例:

class Person
  def initialize(name)
    @name = name
  end

  def display_name
    puts @name # 同じクラス内(インスタンス内) に定義されている @name を参照できる
  end
end

person = Person.new("Alice")
person.display_name # Output: Alice
person.@name #=> Error

この例では、Person クラスの各インスタンスが自身の名前を保持するようにインスタンス変数を使用しています。

しかし、インスタンス変数はあくまでインスタンスの中でだけ使える変数であり、最終行のように外部から呼び出すことは出来ないことに注意しましょう。

初心者の方は「同じクラスの中でだけ使える変数」と覚えると分かりやすいかもしれません。

クラスとインスタンスの基本概念

オブジェクト指向プログラミングの中心となるのが、クラスとインスタンスの概念です。
これらを理解することで、より効率的で整理されたコードの設計と実装が可能となります。

クラスとは

設計図の役割

クラスはオブジェクトの設計図として機能します。
一般的な特性や動作を定義して、それを基に具体的なオブジェクト(インスタンス)を生成します。

例:人間クラス

人間全体を表すクラスを考えてみましょう。
このクラスには、名前や年齢といった共通の属性が含まれるでしょう。

class Human
  def initialize(name, age)
    @name = name
    @age = age
  end
end

インスタンスとは

実体の役割

インスタンスはクラスの設計図に基づいて作成される具体的な「実体」です。
クラスに定義された属性や動作を持つ、個々のオブジェクトとして機能します。

例:特定の人間のインスタンス

上記の人間クラスから、具体的な人間(例:アリス、25歳)のインスタンスを生成できます。

alice = Human.new("Alice", 25)

クラスとインスタンスの関係

それぞれの関係性をまとめてみましょう。

  • クラス: 共通の属性や動作を定義する設計図
  • インスタンス: クラスに基づいて生成される個々の実体。各インスタンスは独自のデータを持つことができます。

Ruby on Railsにおけるインスタンス変数の使い方

Ruby on Railsで開発を行う際、インスタンス変数は非常に重要な概念です。
このセクションでは、インスタンス変数の基本的な使い方について具体的な説明と例を交えて解説します。

コントローラでのインスタンス変数の定義

Ruby on Railsのコントローラー内で、変数名が @ から始まるものはインスタンス変数として認識されます。
このインスタンス変数は、ビューからも参照することができ、データの共有に役立ちます。

例: ユーザー情報の取得

例えば、以下のようにコントローラでインスタンス変数を定義することができます。

def show
  @user = User.find(params[:id])
end

ここで定義された @user は、関連するビューからも参照できるため、情報の受け渡しが容易になります。

ビューでのインスタンス変数の参照

コントローラで定義したインスタンス変数はビューで直接使用できます。

例: ユーザー名の表示

<p><%= @user.name %></p>

この例では、コントローラで設定された @user の名前がビューで表示されます。

なお、インスタンス変数はコントローラと関連するビューでのみ使用できるため、他のビューからは参照できません。

例えば、show アクションで定義された @user は、index アクションのビューからは参照できません。

NG例:

# app/controllers/users_controller.rb
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end

  def index
    @users = User.all
  end
end
# app/views/users/index.html.erb

<% @users.each do |user| %>
  <p><%= user.name %></p>
<% end %>

<p><%= @user.name %></p> # NG

上記のようなコードを実行すると、@user が定義されていないというエラーが発生します。

undefined method `name' for nil:NilClass

このように、コントローラで定義されたインスタンス変数は、そのコントローラと関連するビューでしか使用できないことに注意してください。

目次