【プログラミング初心者】@post = Post.find(params[:id])

今回のタイトルは、@post = Post.find(params[:id])
コントローラーのアクションで定番のように定義する「よく見る」形。これを翻訳して、基本的なところを見直していきたいと思います。

@post = Post.find(params[:id])

Postモデルのテーブルの中から、paramsという箱に格納された[idが付与された特定のデータ]を取得して、@postというインスタンス変数に代入している。 (このidが付与された特定のデータはパラメーターを通じて運ばれてきている。)  

findメソッド

基本的なActiveRecordであり、テーブルの中からデータを探して持ってきてくれる。 そのとき、主キーによる検索をする。 find(キー)のようにキーを引数に指定する。 複数のキーによる検索も可能。

params[:id]

idキーを取得している。 基本的には、上のような形で主キーを検索して取得するが、アソシエーションを関連付けていたりすると、params[:user_id] といったのもある。 これは主キーではなく、外部キーで検索して取得してくる。 例えば、Postモデルのテーブルの中から、Userモデルの外部キーを使ってデータを検索して取得する場合は以下のように記述する。

@post = Post.find(params[:user_id])

undefined method ‘〇〇’ for nil:NilClass

nill:Classのオブジェクトに対して〇〇というメソッドがありません。というエラー
この場合、paramsでidは送られてきてるけど、メソッドが定義されてないことが原因として多い。 こうしたあるあるのエラー文に関しては、ターミナルでルーティングを確認したり、binding.pryでparamsの中身を確認したりしながら仮説検証していくことにだいぶ慣れてきた。

@postとpost

インスタンス変数か変数か
超基本的なとこですが。意外と大事だったりもすると思うので書いておくと、@を付けてインスタンス変数にするのは、ビューファイルで代入した値を渡して表示する必要があるとき。paramsで取得した値をビューで使うのかどうかを考えると@postとpostを区別できるんじゃないでしょうか。

終わりに

今日は簡単な基礎の振り返りでした。 超基本的なことでも、コードを言語化(翻訳)するのは意外と難しい。言語化の練習だと思って少しづつ復習を兼ねて取り入れていきたいと思っています。 しかも、話し言葉で説明するよりもこうして文章に書き落とすのはさらに難しい。よい学習方法を見つけたと思って地道に頑張る。