現在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
以上、お力をお貸しいただけますでしょうか。
何卒、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/16 10:03 編集