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

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

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

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

Ruby on Rails

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

0回答

1290閲覧

Formオブジェクト・画像複数投稿の実装

shunxile

総合スコア26

Ruby

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

Ruby on Rails

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2021/01/13 08:26

編集2021/01/13 11:40

前提・実現したいこと

Ruby on Railsにて画像や動画をメッセージやタイトルと共に投稿するアプリケーションを作成中です。
画像データの投稿をできるようにしたいです。

発生している問題・エラーメッセージ

投稿機能、画像の複数データ投稿実装完了後 タグ付け機能を実装するため投稿機能とタグ付け機能で Formオブジェクトを用いて実装したところタイトルやメッセージは投稿できたが 画像データが保存できませんでした。 追記 現状なぜか画像1つは保存できましたが 2つめからは保存されません 画像データはActiveStorageを用いてDBへ保存する予定です
params => <ActionController::Parameters {"authenticity_token"=>"tw/q0vYN6CD3eHIVdpxGkUWCNQINctf3lIsnvsrS+JuSrJedRv9QRHXBU6yj6PnKjkgPEIkWc/6r3POKnVThrA==", "message_tag"=>{"title"=>"imgtest", "message"=>"imgimg", "whom"=>"imgimgimg", "open_plan(1i)"=>"2025", "open_plan(2i)"=>"5", "open_plan(3i)"=>"5", "images"=>[#<ActionDispatch::Http::UploadedFile:0x00007f8dccf5cd30 @tempfile=#<Tempfile:/var/folders/pg/6dn2c_091hb4pfr45vz6w9fr0000gn/T/RackMultipart20210113-12924-vajy1.jpg>, @original_filename="snowboard_1542357277.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message_tag[images][]\"; filename=\"snowboard_1542357277.jpg\"\r\nContent-Type: image/jpeg\r\n">], "name"=>"imgtest"}, "message"=>{"images"=>[#<ActionDispatch::Http::UploadedFile:0x00007f8dccf5ca88 @tempfile=#<Tempfile:/var/folders/pg/6dn2c_091hb4pfr45vz6w9fr0000gn/T/RackMultipart20210113-12924-96ks7s.jpg>, @original_filename="TimeCapsule2.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[images][]\"; filename=\"TimeCapsule2.jpg\"\r\nContent-Type: image/jpeg\r\n">]}, "commit"=>"想いを残す", "controller"=>"messages", "action"=>"create"} permitted: false> message_params => <ActionController::Parameters {"title"=>"imgtest", "whom"=>"imgimgimg", "message"=>"imgimg", "open_plan(1i)"=>"2025", "open_plan(2i)"=>"5", "open_plan(3i)"=>"5", "name"=>"imgtest", "images"=>[#<ActionDispatch::Http::UploadedFile:0x00007f8dccf5cd30 @tempfile=#<Tempfile:/var/folders/pg/6dn2c_091hb4pfr45vz6w9fr0000gn/T/RackMultipart20210113-12924-vajy1.jpg>, @original_filename="snowboard_1542357277.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message_tag[images][]\"; filename=\"snowboard_1542357277.jpg\"\r\nContent-Type: image/jpeg\r\n">], "user_id"=>1} permitted: true>

該当のソースコード

message.rb

1class Message < ApplicationRecord 2 belongs_to :user 3 has_many_attached :images 4 has_one_attached :video 5 has_many :message_tag_forms, dependent: :destroy 6 has_many :tags, through: :message_tag_forms 7end

tag.rb

1class Tag < ApplicationRecord 2 has_many :messages, through: :message_tag_forms 3 has_many :message_tag_forms 4 5 validates :name, uniqueness: true 6end

message_tag.rb

1class MessageTag 2 3 include ActiveModel::Model 4 include ActiveModel::Attributes 5 include ActiveRecord::AttributeAssignment 6 attr_accessor :title, :whom, :open_plan, :message, :images, :video, :name, :user_id 7 8 with_options presence: true, length: { maximum: 50 } do 9 validates :title 10 validates :whom 11 end 12 13 with_options presence: true do 14 validates :message, length: { maximum: 200 } 15 validates :open_plan 16 validates :user_id 17 validates :name, length: { maximum: 20 } 18 end 19 20 def save 21 @message = Message.create(title: title, whom: whom, open_plan: open_plan, message: message, images: images, video: video, user_id: user_id) 22 tag = Tag.where(name: name).first_or_initialize 23 tag.save 24 25 MessageTagForm.create(message_id: message.id, tag_id: tag.id) 26 end 27end

messages_controller.rb

1class MessagesController < ApplicationController 2 before_action :authenticate_user!, except: [:index] 3 4 def index 5 @messages = Message.includes(:user).order("created_at DESC") 6 end 7 8 def new 9 @message = MessageTag.new 10 end 11 12 def create 13 @message = MessageTag.new(message_params) 14 if @message.valid? 15 @message.save 16 return redirect_to root_path 17 else 18 render :new 19 end 20 end 21 22 def show 23 @message = Message.find(params[:id]) 24 end 25 26 def edit 27 @message = Message.find(params[:id]) 28 if current_user.id != @message.user.id 29 redirect_to root_path 30 end 31 end 32 33 def update 34 @message = Message.find(params[:id]) 35 if @message.update(message_params) 36 redirect_to message_path(@message.id) 37 else 38 render :edit 39 end 40 end 41 42 def destroy 43 @message = Message.find(params[:id]) 44 if current_user.id == @message.user.id 45 @message.destroy 46 redirect_to root_path 47 end 48 end 49 50 def search 51 return nil if params[:keyword] == "" 52 tag = Tag.where(['name LIKE ?', "%#{params[:keyword]}%"] ) 53 render json:{ keyword: tag } 54 end 55 56 private 57 def message_params 58 params.require(:message_tag).permit(:title, :whom, :message, :open_plan, :name, :video, images: []).merge(user_id: current_user.id) 59 end 60end

new.html.erb

1<div class="new-message"> 2 <h1>残したい想い</h1> 3 <%= form_with model: @message, url: messages_path, local: true do |f| %> 4 <%= render 'shared/error_messages', model: f.object %> 5 <div class="posting-form"> 6 <div class="form"> 7 タイトル 8 <span class="indispensable">必須</span> 9 </div> 10 <%= f.text_field :title, class:"form-title", id:"form-title", placeholder:"タイトル名(必須 50文字以内)", maxlength:"50" %> 11 <div class="form"> 12 メッセージ 13 <span class="indispensable">必須</span> 14 </div> 15 <%= f.text_area :message, class:"form-message", id:"form-message", placeholder:"メッセージ内容(必須 200文字以内)例)20年後の子供の誕生日に見て欲しい動画です。" ,rows:"5", maxlength:"200" %> 16 <div class="form"> 17 誰に対してか 18 <span class="indispensable">必須</span> 19 </div> 20 <%= f.text_field :whom, class:"form-whom", id:"form-whom", placeholder:"誰に宛てたものか(必須 50文字以内)例)20年後の子どもたちへ", maxlength:"50" %> 21 <div class="form"> 22 開封予定日 23 <span class="indispensable">必須</span> 24 </div> 25 <div class="form-open-plan"> 26 <%= raw sprintf( 27 f.date_select( 28 :open_plan, 29 class: 'open-plan-object', 30 use_month_numbers: true, 31 prompt:'--', 32 start_year: (Time.now.year), 33 end_year: (Time.now.year + 100), 34 date_separator: '%s'), 35 "<p> 年 </p>", "<p> 月 </p>") + "<p> 日 </p>" %> 36 </div> 37 <div class="form-caution"> 38 ※※※画像か動画どちらか1つの投稿にしてください。※※※ 39 </div> 40 <div class="image-form"> 41 <div class="form"> 42 届ける想い(画像) 43 </div> 44 <div class="click-upload"> 45 <p>クリックしてファイルをアップロード</p> 46 <%= f.file_field :images, name: 'message_tag[images][]', id:"form-image" %> 47 <div id="image-list"></div> 48 </div> 49 </div> 50 <div class="video-form"> 51 <div class="form"> 52 届ける想い(動画) 53 </div> 54 <div class="click-upload"> 55 <p>クリックしてファイルをアップロード</p> 56 <%= f.file_field :video, id:"form-video" %> 57 </div> 58 </div> 59 <div class="tag-form"> 60 タグ 61 </div> 62 <%= f.text_field :name, id:"form-tag", placeholder:"誕生日", maxlength:"20"%> 63 </div> 64 <div class="message-btn-contents"> 65 <%= f.submit "想いを残す" ,class:"message-btn" %> 66 <%= link_to 'もどる', root_path, class:"back-btn" %> 67 </div> 68 <% end %> 69 70</div>

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

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

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

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

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

m.ts10806

2021/01/13 08:30

画像の実体はどこに保存する想定の設計ですか? DB / サーバー / その他
shunxile

2021/01/13 09:02

ActiveStorageを用いてDBに保存しようと思っています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問