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

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

ただいまの
回答率

89.52%

carrierwaveで画像を複数アップロードし、DBに保存

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 795

potter9610

score 1

前提・実現したいこと

carrierwaveで画像を複数アップロードし、DBに保存
商品を保存するitemsテーブルと、画像を保存するphotosテーブルがあります
railsで複数の画像を持った商品出品機能を実装しようとしているのですが、画像を複数枚選択し、保存しようとしても保存されません。
一枚でも保存できませんでした。
エラーは発生していません。

該当のソースコード

sample.html.haml

.product_listing_content
  = render "user-shared/user-header" 
  .product_listing_box
    .product_listing_title
      商品の情報を入力
    = form_with(model: @item, local: true, multipart: true) do |f|
      .upload_box
        .upload_text
          .upload_header 
            出品画像
          .upload_require 
            必須
        %p
          最大10枚までアップロードできます
        = fields_for :photos do |i|
          = i.label :img, class: "image_label", for: "image"  do
            .upload_image
              = i.file_field :img, name: "photos[img][]", multipart: true, class: "file_field", id: "image"
              %pre.image_text

sample.controller.rb

class ItemsController < ApplicationController

  def index

  end


  def new
    @category = Category.all.order("id ASC").limit(13)
    @postage = Postage.all.order("id ASC").limit(2)
    @prefecture = Prefecture.all
    @postage_day = PostageDay.all
    @state = State.all
    @item = Item.new
    @item.photos.build


end


  def category_children  
    @category_children = Category.find(params[:productcategory]).children
    end


  def category_grandchildren
    @category_grandchildren = Category.find(params[:productcategory]).children
    end

  def postage_children 
    @postage_children = Postage.find(params[:postageitem]).children

  end


  def create
    @item = Item.new(item_params)
    @item.save

    redirect_to root_path
  end




  def show
    @search_params = user_search_params
    @prefecrure = Prefecture.all
  end


private



  def user_search_params
    params.fetch(:search, {}).permit(:id,:prefecture)
  end

  def item_params
    params.require(:item).permit(:state_id, :name, :explain, :category_id, :price, :postage_id, :prefecture_id, :postage_day_id, photos_attributes: [:id, {img: []}, :item_id]).merge(user_id: 1, buyer_id: 1, shipping_date: 1, size_id: 1, brand_id: 1)
  end
end

item.rb

has_many :photos
accepts_nested_attributes_for :photos

photo.rb

class Photo < ApplicationRecord
  belongs_to :item, optional: true
  mount_uploaders :img, PhotoUploader
end

ターミナル
Started POST "/items" for ::1 at 2019-08-18 18:01:57 +0900
Processing by ItemsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"2r9aGxEbvqaTm+BMmz+lK0JBnYoHAwPRQrGqWsDwyH4sdND3LI8sz3zlA7z6rEX+N0Wx6YT2449ZfO+bd48peQ==", "photos"=>{"img"=>[#<ActionDispatch::Http::UploadedFile:0x00007fd08ac458a8 @tempfile=#<Tempfile:/var/folders/tf/jtyh4t1n2k913fhwch5fqvxh0000gn/T/RackMultipart20190818-43340-mv15n2.jpg>, @original_filename="book1.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"photos[img][]\"; filename=\"book1.jpg\"\r\nContent-Type: image/jpeg\r\n">]}, "item"=>{"name"=>"p", "explain"=>"p", "category_id"=>"100", "state_id"=>"1", "postage_id"=>"8", "prefecture_id"=>"1", "postage_day_id"=>"1", "price"=>"1000"}, "commit"=>"出品する"}

From: /Users/nakagawashuuma/Desktop/mercari/freemarket_sample_56b/app/controllers/items_controller.rb @ line 38 ItemsController#create:

36: def create
37:   @item = Item.new(item_params)
=> 38:   binding.pry
39:   @item.save
40:   # @photo = Photo.new(photo_params)
41:   # binding.pry
42:   # @photo.save
43:   redirect_to root_path
44: end

[1] pry(#<ItemsController>)> @item = Item.new(item_params)
=> #<Item:0x00007fd0923795c8
id: nil,
name: "p",
explain: "p",
state_id: 1,
price: 1000,
buyer_id: 1,
prefecture_id: 1,
shipping_date: 1,
size_id: 1,
brand_id: 1,
user_id: 1,
created_at: nil,
updated_at: nil,
category_id: 100,
postage_id: 8,
postage_day_id: 1>
[2] pry(#<ItemsController>)> params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"2r9aGxEbvqaTm+BMmz+lK0JBnYoHAwPRQrGqWsDwyH4sdND3LI8sz3zlA7z6rEX+N0Wx6YT2449ZfO+bd48peQ==", "photos"=>{"img"=>[#<ActionDispatch::Http::UploadedFile:0x00007fd08ac458a8 @tempfile=#<Tempfile:/var/folders/tf/jtyh4t1n2k913fhwch5fqvxh0000gn/T/RackMultipart20190818-43340-mv15n2.jpg>, @original_filename="book1.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"photos[img][]\"; filename=\"book1.jpg\"\r\nContent-Type: image/jpeg\r\n">]}, "item"=><ActionController::Parameters {"name"=>"p", "explain"=>"p", "category_id"=>"100", "state_id"=>"1", "postage_id"=>"8", "prefecture_id"=>"1", "postage_day_id"=>"1", "price"=>"1000"} permitted: false>, "commit"=>"出品する", "controller"=>"items", "action"=>"create"} permitted: false>
[3] pry(#<ItemsController>)> params[:photos][:img]
=> [#<ActionDispatch::Http::UploadedFile:0x00007fd08ac458a8
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"photos[img][]\"; filename=\"book1.jpg\"\r\nContent-Type: image/jpeg\r\n",
@original_filename="book1.jpg",
@tempfile=#<File:/var/folders/tf/jtyh4t1n2k913fhwch5fqvxh0000gn/T/RackMultipart20190818-43340-mv15n2.jpg>>]
[4] pry(#<ItemsController>)> 

複数画像選択しているのですが、params に入っているのは最後に選択した一つだけです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる