Sun~sun~Flower's

日々前向きに頑張る為のブログ

MENU

【初心者向け】【Rails】インスタンス変数とルーティングを使いこなす

f:id:mTakata:20200528121753j:plain

こんにちは。

当ページにアクセスしてくださり、ありがとうございます。

 

この記事は、プログラミング言語「Ruby」のフレームワーク「Rails」についての記事になります。 

 

【目次】

問題.1

以下のようなコントローラーがあるとします。

```Rails(Ruby)
1 class ArticlesController < ApplicationController
2 def show
3 article = Article.find(params[:id])
4 end
5 end ``` 

showアクションの中にあるarticleという変数ですが、このままだとビューの表示を意図した通りに行うことができません。

 

その理由と解決策を述べてください。 

模範回答

理由:

Railsではコントローラーで設定された「インスタンス変数」が、ビューに渡される仕組みになっています。

 

「article」ではローカル変数として扱われるため、ビューで使うことができません。(このまま使用すると、ビュー側でエラーが表示されます。)

💡ローカル変数は、それが宣言されたアクション内でしか使えない

上記です。(変数には「スコープ」と呼ばれる、利用範囲たるものが存在しています。)

 

スコープについては、次の記事を読むと理解しやすいのではと思います。

qiita.com

解決策:

インスタンス変数として認識される「@article」に変更します。

【変更後のコントローラー】

```Rails(Ruby)
1 class ArticlesController < ApplicationController
2 def show
3 @article = Article.find(params[:id])
4 end
5 end ``` 

@articleとすることで、別のアクションやビューでも「@article」という変数名で使用でき、その変数に格納されたデータを取り扱うことができます。

問題.2

上記コードの3行目のArticle.find(params[:id])という記述のうち、params[:id]には詳細表示されたいレコードのidが格納されます。

 

なぜそのような動作になるのか、「rails routes」という言葉を使って説明してください。

模範回答

rails routesを使ってアプリケーションのルーティングを確認すると、通常showアクションには以下のような設定がされています。

```Rails(Ruby)
Prefix Verb   URI Pattern   Controller#Action
tweet  GET    /tweets/:id(.:format)   tweets#show ```
 

 そのため、例えば「localhost:3000/tweets/3」というURLが指定されると、paramsの「:id」には「3」が代入されるようになっています。

 

そのため、呼び出されたコントローラー内でparams[:id]として、取り出すことができます。

まとめ

今回は、インスタンス変数とルーティングについて解説しました。

 

初学者の方ですと、変数周りのエラーでつまずくことが多かったりします。

 

ですが今回の記事で、変数には「スコープ」と呼ばれる利用範囲たるものが存在する。

 

上記さえ理解していれば、変数に関するエラーについてほぼ解決できたと言っても過言ではないでしょう。

 

またルーティングに関してはこちらも基礎的な事でして、データベースを取り扱う処理(CRUD処理)でしたら、ルーティングは必須です。

 

ルーティングも理解できれば、より開発が楽しくなると思いますので、難しいかもですが、頑張ってください! 

 

尚、CRUD処理については次の記事で詳しく書いていますので、是非よんでみてください。

www.sunsunflowers.com

以上となります、参考になれば幸いです。

最後まで読んで頂き、ありがとうございました。