Make the Most of IT.

お酒と映画が好きなJava屋さんがRubyとか学んだこと感じたことをつらつらと

【RailsTutorial 2章】一対多のデータモデルを表示しようとしてActiveRecord_Associations_CollectionProxyと出て困った話

はじめに

みなさんこんにちは。

今日はRailsTutorialの2章をやっていてはまったところがあったので、数時間前の自分に当ててブログに書きます。

結論から言うと、下記のようにインデックスの指定とカラム名の指定をすることで表示することができました。

<p>
  <strong>Microposts:</strong>
  <%= @user.microposts.first.contents %>
</p>

ハマったところ

ハマったところは「2.3.3 ユーザーはたくさんマイクロポストを持っている」の演習1「ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。」です。

この2.3.3は、データモデル同士の関連付けを学習するパートです。1つのユーザーに対して複数のMicropostsを関連付けて表現することを学びました。

つまりuser : Micropostsで一対多の関係となっています。

f:id:marumama6:20181224174711p:plain

最初何も考えずにshow.html.erbへMicropostsの表示部分を追加しました。

<p>
  <strong>Microposts:</strong>
  <%= @user.microposts%>
</p>

こんなの簡単じゃーんと思いながら確認してみると、登録したMicropostsが表示されずよくわからない文章のActiveRecord_Associations_CollectionProxyが表示されていました。

f:id:marumama6:20181224174408p:plain

試行錯誤

よくよく調べてみると、一対多の関係となっている多の方のデータモデルは配列のようになっているようで、インデックスを指定しなければならないことがわかりました。

演習は最初のマイクロポストと指定があるため、下記のようにソースを変更します。

<p>
  <strong>Microposts:</strong>
  <%= @user.microposts.first %>
</p>

Active~は消えましたが、まだハッシュ値のままです。

f:id:marumama6:20181224175741p:plain

またしばらく云々と唸りながらPCとにらめっこしていると、RailsTutorialにこんな記述が

>>micropost = first_user.microposts.first => #<Micropost id: 1, content: "First micropost!", user_id: 1, created_at: "2016-05-15 02:37:37", updated_at: "2016-05-15 02:37:37"

Micropostsはidとcontentから成り立っているからcontentを指定しなければならないのでは…?

早速指定してみると

<p>
  <strong>Microposts:</strong>
  <%= @user.microposts.first.content %>
</p>

出ました!!!

f:id:marumama6:20181224180447p:plain

おわりに

と言うことで、RailsTutorial中にハマってしまったところを紹介しました。

RailsTutorialの演習が結構がっつり調べながら進める形式になっていてとても勉強になります。

タイムふろしきとかで数時間前の自分に届け!