こんにちは、プログラミング初学者のkoheiです。
今日は
Active Storageをインストールし、アソシエーションを組んでいるのに画像が表示されない。
ということがありました。
ビューファイルを制作するためにtestで1つだけレコードを作成。
Active Storageで画像は保存できています。
それなのにimage_tagで画像を呼び出せませんでした。
結論から言うと、
変数に代入したパラメーターへの認識の甘さが原因でした。
今回登場するのは"parts"コントローラーとビューのみです。
まず
partsコントローラーにて
def index
@parts = Part.all
end
ビューファイルにて
<%= image_tag @parts.image if @parts.image.attached? %>
と記述しました。
するとNoMethodErrorがでます。
上記で既に間違っているので、慣れている方は普通に気付くんだと思います。
しかし、初心者の私は焦ります。笑
エラー文に
undefined method `image' for #Part::ActiveRecord_Relation:0x00007f8566f76140
とあったため
@partsのパラメーターを確認したところ、
imageが含まれていないじゃないか! ということでモデルからマイグレーションファイルまで覗き始めました。笑
↑ちなみに含まれてないことは問題ではありませんでした!
色々探して最終的に間違いはコントローラーにあることに気づきます。
以下のように記述すべきでした。
def index
@parts = find(2)
end
Part.allがダメだった理由としては
allとすることで@partsに代入される値がハッシュ構造となってしまうためです
確認するとパラメーターは以下の様になっていました。
@parts
=> [#<Part:0x00007fb31f995b90
id: 2,
name: "test",
info: "test"]
Part.find(2)だと以下の様になります。
@parts
=> #<Part:0x00007fb31ffc6758
id: 2,
name: "test",
info: "test"
アプリとしてはpartsを一覧表示させたいので
最終的にはPart.allとeach文で進めていきます。
とにかく、allの中身が1つでも配列で出力されるということが分かり、自分としてはとても勉強になりました。
同じく初心者の方はお気をつけ下さい。