🔥

【Rails】「@」とはなんぞや?MVCモデルと理解する

2024/04/13に公開

はじめに

Rails Tutorial「7.1.2 Userリソース」の章の内容を一部引用させていただきます。

https://railstutorial.jp/chapters/sign_up?version=7.0#sec-a_users_resource

結論

「@」記号は、インスタンス変数を表します

インスタンス変数とは?

  • インスタンス変数は、オブジェクトの状態を保持するために使用されます。
  • コントローラーからビューへデータを渡す際に重要な役割を果たします。

これだけでは「なんのこっちゃ」という話なので、以下の具体的なコードでインスタンス変数を確認していきましょう。

コード

users_controller.rb

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

users_show.html.erb

<%= @user.name %>, <%= @user.email %>

Local環境

どのような流れでUser情報がブラウザへ?

  1. データベースに格納されているUser情報が、モデルを介してコントローラーへと渡されます。
  2. コントローラー内で、User.find(params[:id])によって特定のUser情報を取得します。
  3. 取得したUser情報を@user(インスタンス変数)に格納します。
  4. @userをビューへ渡すことで、データベースのUser情報がブラウザに表示されます。

▼以下MVCモデルの添付画像に↑上記番号を付与しました

※以下のツールを利用して↑上記画像を作成
https://plus.excalidraw.com/

  1. データベースに格納されているUser情報が、モデルを介してコントローラーへと渡されます。
  2. コントローラー内で、User.find(params[:id])によって特定のUser情報を取得します。

users_controller.rb

User.find(params[:id])
  1. 取得したUser情報を@user(インスタンス変数)に格納します。
@user = User.find(params[:id])
  1. @userをビューへ渡すことで、データベースのUser情報がブラウザに表示されます。

users_show.html.erb

<%= @user.name %>, <%= @user.email %>

もし、「@」が無し(ローカル変数)だと以下のエラーが出ます

ローカル変数(例:user)とインスタンス変数(例:@user)の違い

読者の皆様はすでにお気づき(あるいはご存じ)かもしれませんが、
ローカル変数とインスタンス変数の主な違いは、そのスコープとアクセス可能な範囲にあります。

ローカル変数(例:user)

  • 特定のメソッド内でのみ有効な変数です。
  • メソッドの外部からはアクセスできません。

インスタンス変数(例:@user)

  • コントローラーのアクション内で定義され、ビューなどのメソッド外部からもアクセス可能な変数です。
  • これにより、コントローラーからビューへデータを渡すことができます。

※ちなみにグローバル変数(例:@@user)もあるが、ここでの説明は割愛

まとめ

「@」記号は、Railsにおいてインスタンス変数を示し、MVCアーキテクチャにおけるデータの流れをスムーズにします。ローカル変数とインスタンス変数を適切に使い分けることで、Railsアプリケーションの効率的なデータ管理が可能になります。

参考

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html

https://qiita.com/mogulla3/items/cd4d6e188c34c6819709

Discussion