🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

869閲覧

Rails APIモードでActiveStorageに複数画像を保存する方法

sr2000

総合スコア39

Ruby

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

Ruby on Rails

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/11/30 11:01

タイトルどうりではありますが、APIモードにてActiveStorageに画像を複数保存することができずに困っております。
かれこれ1ヶ月悩んでおります。
rubyではモデルにてhas_many_attached :myImageを追加して
コントローラーでは@image = Image.new params.permit(:uuid, :title, :detail, myImage: [])
とparams.require(:image).permit(:uuid, :title, :detail, myImage: [])
を追加するだけので、間違いはないと思うのですが、
画像の送信方法がおかしいのでしょうか?
ちなみにhas_one_attachedで画像1枚の時はちゃんと保存されています。
宜しくお願いします。

curl

1curl -F uuid=0987654321 -F title=test01 -F detail=詳細 -F myImage=@/Users/dog_logo.jpg -F myImage=@/Users/wwdc.jpg http://(IP):3000/images

ruby

1class Image < ApplicationRecord 2 include Rails.application.routes.url_helpers 3 # has_one_attached :myImage 4 has_many_attached :myImage 5 6 # 画像のurl取得のためのメソッド 7 def image_url 8 myImage.attached? ? url_for(myImage) : nil 9 end 10end

ruby

1class ImagesController < ApplicationController 2 before_action :set_image, only: [:show, :update, :destroy] 3 4 # GET /images 5 def index 6 @images = Image.all.select('id', 'uuid', 'title', 'detail') 7 8 image_info = @images.as_json(methods: :image_url) 9 render json: {imageCount: image_info.size, item: image_info } 10 end 11 12 # GET /images/1 13 def show 14 render json: @image 15 end 16 17 # # POST /images 18 def create 19 20 @image = Image.new params.permit(:uuid, :title, :detail, myImage: []) 21 if @image.save 22 render json: {result: 0} 23 else 24 render json: {result: 1} 25 end 26 end 27 28 # PATCH/PUT /images/1 29 def update 30 if @image.update(image_params) 31 render json: @image 32 else 33 render json: @image.errors, status: :unprocessable_entity 34 end 35 end 36 37 # DELETE /images/1 38 def destroy 39 @image.destroy 40 end 41 42 private 43 # Use callbacks to share common setup or constraints between actions. 44 def set_image 45 @image = Image.find(params[:id]) 46 end 47 48 # Only allow a trusted parameter "white list" through. 49 def image_params 50 params.require(:image).permit(:uuid, :title, :detail, myImage: []) 51 end 52end 53

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

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

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

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

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

guest

回答1

0

ベストアンサー

パラメータを配列で渡す場合はmyImage[]=@/Users/dog_logo.jpgのようにキーの後に[]を付ける必要があるかと思います。

投稿2019/12/01 02:19

peperoncino000

総合スコア148

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

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

sr2000

2019/12/01 04:58

回答ありがとうございます。 ご指摘頂いたとおりに curl -F uuid=0987654321 -F title=test01 -F detail=詳細 -F myImage[]=@/Users/dog_logo.jpg -F myImage[]=@/Users/wwdc.jpg http://IP:3000/images zsh: no matches found: myImage[]=@/Users/kojima/dog_logo.jpg とういうエラーが返ってきます。 何かキーが間違っているという感じだと思うのですが、やはりまだcurlの方法がおかしいのでしょうか? よろしくおねがいします。
peperoncino000

2019/12/01 05:00

zshではなくbashで実行してみるとどうでしょうか?
sr2000

2019/12/01 05:04

失礼いたしました。 curl -F uuid=0987654321 -F title=test01 -F detail=詳細 -F 'myImage[]=@/Users/kojima/dog_logo.jpg' -F 'myImage[]=@/Users/kojima/wwdc.jpg' http://192.168.3.2:3000/images ファイルの指定を「''」で囲むことで無事保存できました。 非常に助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問