🍉

【Ruby on Rails】@articleとarticleの違い(ローカル変数とインスタンス変数の違い)

2024/07/21に公開

2024/1からプログラミングスクールに通っている、プログラミング初学者です。
2024/6/28より自分自身のアウトプットのために、毎日投稿をしています。
初学者の投稿になるため間違い等ございましたら、優しくご指摘いただけますと幸いです。

今回の記事を書いた理由

現在Ruby on Railsを使用し、記事アプリを作成しております。
その中で理解の浅かった部分が明るみになったので、今回はその内容を書いていきたいと思います。
大雑把なタイトルですが、@articleとarticleの違い(ローカル変数とインスタンス変数の違い)についてです。

アプリ作成をする中で、

  • 記事一覧画面から、記事の詳細へ画面遷移する
  • 記事詳細画面上に、編集・削除ボタンを実装する
    この2つの処理を行いました。

記事一覧画面から記事本文の詳細画面へ遷移させるため、viewファイル(index.html.erb)では

<%= link_to article.title, article_path(article) %> 

と実装し、

記事詳細画面上では、編集・削除ボタンを設置しています。

下記がそのviewファイル(show.html.erb)です。

<%=link_to '編集', edit_article_path(@article)%>
<%=link_to '削除', article_path(@article) %>

今回@articleとarticleの違い(ローカル変数とインスタンス変数の違い)が理解できていないと感じたのは、実装する中で

<%= link_to article.title, article_path(@article) %> 

と実装しており、下記エラーが生じたためです。
Image from Gyazo

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

私自身が理解できていなかったのは、ローカル変数とインスタンス変数の使い方でした。
エラーを読み解き、ChatGPTにも確認しながら出した結論です。

記事一覧画面から、記事の詳細へ画面遷移するviewファイル(index.html.erb)

<% if @articles.present? %>
 <% @articles.each do |article| %>
<%= link_to article.title, article_path(article) %>
<% end %>
<% end %>

の中の、article_path(article)で参照しているのは、一覧画面に複数表示されている中の記事の1つ。

index.html.erbでは、もし投稿が存在する場合には、記事を1つずつを表示するようeach文で回しています。そのeach文のループ内で回しているarticle(ローカル変数)の本文詳細を参照したいため、article_path(article)の表記となっている。

記事詳細画面上に、編集・削除ボタンを実装するviewファイル(show.html.erb)

<%= link_to article.title, article_path(@article) %> 

ここでは、Articlesコントローラーのedit, destroyアクションで定義している@articles(インスタンス変数)を参照しているため、@ariticleとなる。

@article = current_user.articles.find(params[:id])

と定義しているため、特定の記事を編集削除できる。

頭では理解しているつもりでしたが、改めてローカル変数とインスタンス変数の違いを学ぶことができました。
ありがとうございました。

Discussion