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

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

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

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

HTML

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

Q&A

解決済

3回答

1000閲覧

画像を複数同時にアップロード、DBに保存したい。

hiromats

総合スコア17

Ruby on Rails

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

HTML

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

0グッド

0クリップ

投稿2018/11/20 23:05

編集2018/11/21 05:38

複数同時にプレビューした画像をアップロード、DBに保存したいのですが、上手くいきません。
multiple: trueやparams.require(:item).permit(:name, item_images_attributes: {images: []})など複数同時にアップロード、保存するのに必要そうなコードは使ってもダメでした。
コードの記入の仕方がおかしいのか、まだ記入したりないコードがあるのかどうかご教授いただければ幸いです。
よろしくお願いします。

new.html.erb

html

1<%= form_for @item do |f| %> 2 <main class="single-main"> 3 <section class="l-single-container buy-item-container"> 4 <div data-reactroot=""> 5 <div class="sell-container-inner"> 6 <h2 class="l-single-head">商品の情報を入力</h2> 7 <form class="sell-form"> 8 <div class="sell-upload-box"> 9 <h3 class="sell-upload-head">画像 10 <span class="form-require">必須</span> 11 </h3> 12 <p>2枚までアップロードできます</p> 13 <div class="sell-dropbox-container clearfix"> 14 <div class="sell-upload-items have-item", id="items"> 15 <%= f.fields_for :item_images do |image| %> 16 <ul id="item"> 17 <li class="sell-upload-item"> 18 <div class="sell-upload-item-1"> 19 <figure class="sell-upload-figure figure-1"> 20 <img> 21 <input type="file" class="sell-upload-drop-file" multiple="multiple" name="image[]" style="display: none"> 22 <pre class="visible-pc-1">ドラッグアンド<br>ドロップ<br>またはクリックして<br>ファイルを<br>アップロード</pre> 23 <%=image.file_field :image %> 24 </figure> 25 </div> 26 </li> 27 <li class="sell-upload-item"> 28 <div class="sell-upload-item-2"> 29 <figure class="sell-upload-figure figure-2"> 30 <img> 31 <input type="file" class="sell-upload-drop-file" multiple="multiple" name="image[]" style="display: none"> 32 <pre class="visible-pc-2">ドラッグアンド<br>ドロップ<br>またはクリックして<br>ファイルを<br>アップロード</pre> 33 <%= image.file_field :image %> 34 </figure> 35 </div> 36 </li> 37 </ul> 38 <% end %> 39 </div> 40 </div> 41 </div> 42          <div class="sell-content"> 43 <div class="form-group"> 44 <%= f.label :商品名 %> 45 <span class="form-require">必須</span> 46 <div> 47 <%= f.text_field :name, class: "input-default", value: "", placeholder: "商品名(必須 40文字まで)" %> 48 </div> 49 </div> 50 </div> 51 <button type="submit" class="btn-default btn-red">アップロード</button> 52 <a href="/" class="btn-default btn-gray">もどる</a> 53 </form> 54 <div class="overlay"></div> 55 </div> 56 </div> 57 </section> 58 </main> 59 <% end %> 60

items_controller.rb

class ItemsController < ApplicationController def index end def new @item = Item.new @item.item_images.build end def show end def create @item = Item.new(item_params) if @item.save redirect_to :root else render :new end end private def item_params params.require(:item).permit( :name, item_images_attributes: :images ) end end

item_image.rb

class ItemImage < ApplicationRecord belongs_to :item mount_uploader :image, ImageUploader validates :image, presence: true end

item.rb

class Item < ApplicationRecord has_many :item_images, dependent: :destroy accepts_nested_attributes_for :item_images validates :name, presence: true end

追記
new.html.erb

<input type="file" class="sell-upload-drop-file" multiple="multiple" name="image" style="display: none">のname="image"を、name="image[]"に変更
他にもname="image-1"や"image-2"と名前を別々にして試しました。

<%= image.file_field :image, multiple: "true" %>を、<%= image.file_field :image %>に変更。
paramsを受け取れなかったため。

items_controller.rb

item_images_attributes: {images: []}を、item_images_attributes: :imagesに変更。
上記同様、paramsを受け取れなかったため。

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

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

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

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

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

guest

回答3

0

同名nameは全てにデータがある場合、上書きされてhtml上で最下部のもののみ送られることになります。
radioをイメージしていただければと。
既に回答にあるように配列で受け取りループで受け取るか、別nameをつけてそれぞれ受け取ってください。

投稿2018/11/21 00:10

m.ts10806

総合スコア80850

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

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

hiromats

2018/11/21 00:34

radioは使ったことがないので、よく分かりませんが、同名のデータを送ろうとすると上書きされるということは理解出来ました。 その方法で試してみます。
hiromats

2018/11/21 01:48

他の回答者にもコメントしましたが、駄目でした。 違う視点で考えてみようと思います。
m.ts10806

2018/11/21 02:18

どのようなコードになったか質問文を更新してください。 もうひとつの回答者さんもこちらの意図通りに反映されているか確認したいと思うので。
hiromats

2018/11/21 05:39

申し訳ありません。 更新しました。 そちら側の意図とは違う書き方になってるかもしれませんが、よろしくお願いいたします。
hiromats

2018/11/21 21:36

すいません、自己解決しました。 回答ありがとうございました。
guest

0

html<input type="file" class="sell-upload-drop-file" multiple="multiple" name="image" style="display: none">の部分、2回出てきていますが、name="image[]"と配列にすべきでは?

投稿2018/11/20 23:16

colling

総合スコア798

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

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

hiromats

2018/11/21 00:00

指摘されるまで気にしていませんでしたが、配列にするやり方はまだよく分かっていないので、調べてみようと思います。 name ="image[]"と配列にすべき、とは[]に使い回すコードを入れるということでしょうか?
colling

2018/11/21 00:07 編集

いえ、name="image" だとサーバのtempフォルダに送った時、上書きされるので、name="image[]"で複数個送るような感じです
hiromats

2018/11/21 00:31

なるほど、同名を使う場合は配列にしないと上書きされると。 PCを開いたら、name="image"の箇所を、name="image[]"に修正して試してみます。
hiromats

2018/11/21 01:47

試してみましたが、上手くいきませんでした。 nameの名前を変えても同じくです。
colling

2018/11/21 03:04

mts10806さんが書いておられるように、受け取り側の処理も配列から1つずつ取り出さなくてはいけません。
hiromats

2018/11/21 05:40

申し訳ありません。 更新しました。 そちら側の意図とは違う書き方になってるかもしれませんが、よろしくお願いいたします。
hiromats

2018/11/21 21:36

すいません、自己解決しました。 回答ありがとうございました。
guest

0

自己解決

自己解決しました。
item_image.rbにbelongs_to :userと、繋がっていないテーブルとアソシエーションを組もうとしていたのが原因でした。
質問の内容には書いていませんが、必要最低限の情報だけここに記そうとしたので、書きませんでした。
回答してくださった方々お手数をかけてして申し訳ありません。

投稿2018/11/21 21:34

hiromats

総合スコア17

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

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

m.ts10806

2018/11/21 21:38

何が必要な情報かは質問者さんが決めることではない、というのが実際です。 質問する場合は何が必要かわからない状態かと思うので基本的には全て提示してください。 提示していない部分に実は的確な回答を得るために必要な情報があると、回答者を振り回す結果になります(後出しはどの場面でもされる方にとっては辛いですよね)
hiromats

2018/11/21 21:43

はい、申し訳ありませんでした。 言い訳になりますが、コードが冗長になると読みづらくなり、回答者の方も読む気を無くすのではないかと素人ながらいらない気遣いをしてしまいました。 わざわざ付き合ってくださってありがとうございました。
m.ts10806

2018/11/21 21:49

んー。そこは読んでみないと分からないところがありますね。 私個人としては必要なところが削られるよりマシと言ったところです。 ちょこちょこ削るとそれも必要なところを削ってしまう可能性もありますしね。 今回で言うとデザインに関係するところはあまり関係ないのでformに関連するところだけ切り出すとかすると良かったかもしれません。 今後の参考にしてみてください。
hiromats

2018/11/21 22:02

はい、参考にさせていただきます。 切り出しは上手く出来るか分かりませんが、今回のように最低限の情報だけに絞らないよう気をつけていきます。
m.ts10806

2018/11/21 22:05

もし切り出しうまくできてなくても「他にもこういった情報が欲しい」というのは回答者の方から追記依頼があると思いますので、都度対応していって質問の精度を上げていけばいいかなと思います。やっていくうちに自分でも問題が整理できていって自己解決に至れる頻度も上がってくるでしょう。 がんばってください。
hiromats

2018/11/21 22:09

今回もご親切にありがとうございました。 とてもタメになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問