こんにちは。
当ページにアクセスしてくださり、ありがとうございます。
この記事は、プログラミング言語「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」ではローカル変数として扱われるため、ビューで使うことができません。(このまま使用すると、ビュー側でエラーが表示されます。)
💡ローカル変数は、それが宣言されたアクション内でしか使えない
上記です。(変数には「スコープ」と呼ばれる、利用範囲たるものが存在しています。)
スコープについては、次の記事を読むと理解しやすいのではと思います。
解決策:
インスタンス変数として認識される「@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処理については次の記事で詳しく書いていますので、是非よんでみてください。
以上となります、参考になれば幸いです。
最後まで読んで頂き、ありがとうございました。