tm762108
@tm762108 (t m)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

アイテム一覧ページに登録した画像を表示させたい

Q&A

Closed

表題のために、モデルファイルに

Item.rb
class Item < ApplicationRecord
  has_many :item_images, dependent: :destroy
 (中略)
end
ItemImage.rb
class ItemImage < ApplicationRecord
  belongs_to :item
 (中略)
end

というアソシエーションを組み、一覧表示させるために

index.html.haml
    - @items.each.with_index(1) do |item, i|
      = content_tag :tr do
        = image_tag(@images.image)
        = content_tag :td, link_to(item.name, item)
        = content_tag :td, item.status_id
     (中略)

というビューと

items_controller.rb
  def index
    @items = Item.all
    @images = ItemImage.all
  end
  (中略)

というコントローラーを作成したのですが、

アクションコントローラーで
NoMethodError in Items#index
という表示が出て、imageが定義されていないというエラーが出てしまいます。

ちなみにアクション内でbinding.pryをすると、ちゃんと@imagesの中にはimageカラムが存在します。
.allなので複数のデータが選択されているため、このような書き方でないのかもしれませんが、正確な書き方がわからず、教えていただきたく、よろしくお願いいたします。
(Itemテーブルに紐づくItemImageテーブルの1枚目の写真を一覧に表示したいです。)

0

1Answer

NoMethodError in Items#index
という表示が出て、imageが定義されていないというエラーが出てしまいます。

エラーメッセージは自分の言葉に直すのではなく、出力された文字列をそのまま貼り付けてください。どこで何のエラーが出たか回答者に伝わりやすくなります。

さて、エラーメッセージはこんな感じではなかったでしょうか?

undefined method `image' for #<ItemImage::ActiveRecord_Relation:0x0000...>
--------------------------------------------------------------------
    - @items.each.with_index(1) do |item, i|
      = content_tag :tr do
        = image_tag(@images.image) # この行が赤くなる
        = content_tag :td, link_to(item.name, item)
        = content_tag :td, item.status_id

@images.image でエラーが出るはずです。

ここで @images は relation オブジェクトです。 ItemImage オブジェクトが複数入った配列のようなものです。 imageItemImage のメソッドですから relation オブジェクトに対して呼び出すことはできません。

また、ここでやりたいのはそれぞれの Item について紐付いた複数の画像を列挙することではないでしょうか。コードはこんな感じになるはずです。(このコードは非効率的な SQL 文を発行しますがそれは置いておきます。)

    - @items.each.with_index(1) do |item, i|
      = content_tag :tr do
        = item.item_images.each do |image|
          = image_tag(image.image)
1Like

Comments

  1. @tm762108

    Questioner

    ありがとうございます!
    教えていただいたことをヒントに以下のように記述したらうまくテーブルタグの中に写真を治めることができました。

    ```
    - @items.each.with_index(1) do |item, i|
    = content_tag :tr do
    = item.item_images.each do |image|
    = content_tag :td, image_tag(image.image, :size => '50x60')
    = content_tag :td, item.status_id
    ```

    ただし、回答者さんもおっしゃっているように画像以外の情報も枠外に記載されており、これを消す作業を現在実行中です。
    長時間つまずいていたところを進めることができました。
    本当にありがとうございます。

Your answer might help someone💌