質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1387閲覧

Rails gem "refile" で複数画像を投稿後、indexページに最初の一枚のみずつeach表示させたい

Guttie

総合スコア6

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/12/13 15:02

編集2021/12/13 15:48

現在Rails でアプリを作成しています。
美味しかったお店の写真を複数枚と感想などを併せて投稿する機能を実装中に以下のエラーメッセージが発生しました。
https://qiita.com/japwork/items/dcca7ead2d3c334b124c
https://qiita.com/corogit/items/3aeb3076115de2d26283
を参考にしたのですが、最後の一覧表示でどうも上手く動いてくれません。
shops/indexに投稿された写真の一枚目のみがそれぞれ表示されるようにしたいです。
(将来的にはスライダーを使って複数枚表示せられるように変更する予定です。)

#発生しているエラー

Rails

1NoMethodError in Shops#index 2 3Showing /home/ec2-user/environment/shokupanbu/app/views/shops/index.html.erb where line #6 raised: 4 5undefined method `shop_images' for #<Shop::ActiveRecord_Relation:0x00007ffa3820a960> 6Extracted source (around line #6): 7 8<div class="row"> 9 <div class="col-lg-12"> 10 <% @shops.shop_images.first(1).each do |image| %> 11 <div id="slider"> 12 <%= attachment_image_tag image, :image, :fill, 350, 350, size: "350x350" %> 13 </div> 14 15Rails.root: /home/ec2-user/environment/shokupanbu 16 17Application Trace | Framework Trace | Full Trace 18app/views/shops/index.html.erb:6:in `_app_views_shops_index_html_erb___3230042918495568755_70356330104460'

#該当のソースコード
/app/views/shops/new.html.erb

HTML

1<main> 2 <h2 class="title">NEW SHOP</h2> 3 <div class="container"> 4 <div class="row"> 5 <div class="col-lg-6 mx-auto"> 6 <h3>食パン 新規投稿フォーム</h3> 7 <p class="text-danger mb-5">※印は必須項目です。</p> 8 <%= form_with model: @shop, local:true do |f| %> 9 <div class="form-group"> 10 <%= f.label :image, "画像" %><span class="text-danger">※</span> 11 <%= f.attachment_field :shop_images_images, multiple: true %> 12 </div> 13 <div class="form-group"> 14 <%= f.label :name, "店舗名" %><span class="text-danger">※</span> 15 <%= f.text_field :name, class: "form-control" %> 16 </div> 17 <div class="form-group"> 18 <%= f.label :review, "レビュー" %><span class="text-danger">※</span> 19 <%= f.text_area :review, rows: "5", class: "form-control" %> 20 </div> 21 <div class="my-5"> 22 <%= f.submit "投稿", class: "btn btn-outline-success mx-auto d-block" %> 23 </div> 24 <% end %> 25 </div> 26 </div> 27 </div> 28</main>

/app/views/shops/index.html.erb

HTML

1<main> 2 <h2 class="title">SHOPS</h2> 3 <div class="container"> 4 <div class="row"> 5 <div class="col-lg-12"> 6 <% @shops.shop_images.first(1).each do |image| %> 7 <div id="slider"> 8 <%= attachment_image_tag image, :image, :fill, 350, 350, size: "350x350" %> 9 </div> 10 <% end %> 11 </div> 12 </div> 13 </div> 14</main>

/app/controllers/shops_controller.rb

rails

1class ShopsController < ApplicationController 2 before_action :authenticate_user! 3 4 def index 5 @shops = Shop.all 6 end 7 8 def new 9 @shop = Shop.new 10 end 11 12 def create 13 @shop = Shop.new(shop_params) 14 @shop.user_id = current_user.id 15 @shop.save 16 redirect_to shops_path 17 end 18 19 def show 20 @shop = Shop.find(params[:id]) 21 end 22 23 def destroy 24 end 25 26 private 27 28 def shop_params 29 params.require(:shop).permit(:image, :name, :review, shop_images_images: []) 30 end 31end

/app/models/shop.rb

rails

1class Shop < ApplicationRecord 2 3 belongs_to :user 4 5 has_many :shop_images, dependent: :destroy 6 accepts_attachments_for :shop_images, attachment: :image 7end 8

/app/models/shop_image.rb

rails

1class ShopImage < ApplicationRecord 2 belongs_to :shop 3 attachment :image 4end 5

/db/schema.rb

rails

1ActiveRecord::Schema.define(version: 2021_12_13_141259) do 2 3 create_table "shop_images", force: :cascade do |t| 4 t.integer "shop_id", null: false 5 t.integer "image_id", null: false 6 t.datetime "created_at", null: false 7 t.datetime "updated_at", null: false 8 t.index ["shop_id"], name: "index_shop_images_on_shop_id" 9 end 10 11 create_table "shops", force: :cascade do |t| 12 t.string "name", null: false 13 t.text "review", null: false 14 t.integer "user_id", null: false 15 t.datetime "created_at", null: false 16 t.datetime "updated_at", null: false 17 end 18 19 create_table "users", force: :cascade do |t| 20 t.string "email", default: "", null: false 21 t.string "encrypted_password", default: "", null: false 22 t.string "reset_password_token" 23 t.datetime "reset_password_sent_at" 24 t.datetime "remember_created_at" 25 t.string "full_name", null: false 26 t.string "nick_name", null: false 27 t.datetime "created_at", null: false 28 t.datetime "updated_at", null: false 29 t.index ["email"], name: "index_users_on_email", unique: true 30 t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 31 end 32 33end 34

以上、お力をお貸しいただけますでしょうか。
何卒、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Error message

undefined method `shop_images' for #<Shop::ActiveRecord_Relation:0x00007ffa3820a960>

なので、これは、Relation オブジェクトにはshop_imagesというメソッドは存在しない、という意味です。通常、Relationオブジェクトにそんなメソッドは存在しないので、エラー自体は当然と言えます。
この該当オブジェクトは、@shops

ruby

1 # /app/controllers/shops_controller.rb 2 @shops = Shop.all

ですね。つまり、Shopモデルのすべてのオブジェクトを含む Relationです。なお、これはモデルオブジェクトではありません!

モデル(/app/models/shop.rb)を見る限り Shop モデルには、shop_images というメソッドが存在しますが、これは Relationとは関係ありません。
喩えていえば、Relationは配列みたいなもの、Modelは配列の要素みたいなものです。

一枚目だけ表示させたいのであれば、たとえば index.html.erb にて、

erb

1 <%# @shops.shop_images.first(1).each do |image| 2 %> 3 <% image = @shops.first.shop_images.first %>

くらいでしょうか。最初のshopについて全部のイメージでループならば、

erb

1 <% @shops.first.shop_images.each do |image| %>

くらいになりましょうか。
全部の店について全部の画像であれば、これに加えて @shops でさらにループです。
確認していませんが、上を参考に、工夫してみてください。

投稿2021/12/14 01:03

MasaSakano

総合スコア188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Guttie

2021/12/16 10:03 編集

Sakanoさん回答ありがとうございました! お陰様で、お教えいただいた記述に下記を加えて無事に全投稿の複数写真を それぞれ表示させることができました。本当にありがとうございました! <% @shops.each do |shop| %> <div id="slider_<%= shop.id %>"> <% shop.shop_images.each do |image| %> <%= link_to shop_path(shop.id) do %> <%= attachment_image_tag image, :image, format: 'jpeg', size: "350x350" %> <% end %> <% end %> </div> <% end %>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問