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

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

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

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

Q&A

解決済

1回答

1747閲覧

一括でデータを送信する方法

kosuke_ikeura

総合スコア19

Ruby on Rails

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

0グッド

3クリップ

投稿2019/12/18 14:32

料理を投稿できるサービスを作っています。

イメージ説明

とてもセンスのないデザインですが、このようなフォームで料理を投稿できるサービスを作っています。

そこで、Material(材料)の項目が、材料と分量という2つカラムがあるかつ、複数のデータを投稿する必要があります。複数のデータを一括で登録する方法はわかりました。

【Rails 5】モデルを一括登録する手順

Cookingと1対多の関係であるMaterialモデルを作り、さらに、Materialモデルを複数一括で保存するためのモデルMaterialCollectionモデルを作成しました。

Cooking.rb

1class Cooking < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 belongs_to :user 4 has_many :materials 5end

Material.rb

1class Material < ApplicationRecord 2 belongs_to :cooking 3 validates :material, presense: true 4end 5

MaterialCollection.rb

1lass MaterialsCollection 2 include ActiveModel::Conversion 3 extend ActiveModel::Naming 4 extend ActiveModel::Translation 5 include ActiveModel::AttributeMethods 6 include ActiveModel::Validations 7 8 attr_accessor :collection 9 10 def initialize(attributes = []) 11 if attributes.present? 12 self.collection = attributes.map do |value| 13 Material.new( 14 material: value['material'], 15 amount: value['amount'] 16 ) 17 end 18 else 19 self.collection = Material_NUM.times.map{ Material.new } 20 end 21 end 22 23 def persisted? 24 false 25 end 26end

しかしここで問題があり、フォーム登録のurlが/cookings/newなのですが、この時、materialコントローラーを呼び出すことができず、困っています。

cookings/new.html.erb

1<div> 2 <h2>レシピを投稿しよう!</h2> 3</div> 4 5<%= form_for @cooking do |f| %> 6 <h2>レシピ名</h2> 7 <%= f.label :name, "レシピ名" %> 8 <%= f.text_field :name %> 9 <h2>画像</h2> 10 <%= f.label :image, "画像"%> 11 <%= f.file_field :image %> 12 <h2>材料</h2> 13 <%= form_with model: @material, url: materials_path, local: true do |form| %> 14 <% @materials.map.each do |material|%> 15 <%= fields_for 'materials[]', material do |field| %> 16 <div class="field"> 17 <%= field.label :material %> 18 <%= field.text_field :material %> 19 </div> 20 21 <div class="field"> 22 <%= field.label :amount %> 23 <%= field.text_field :amount %> 24 </div> 25 </br> 26 <% end %> 27 <% end %> 28 <% end %> 29 <%= f.submit "投稿する" %> 30<% end %>

materials_controller

1class MaterialsController < ApplicationController 2 def new 3 @materials = MaterialsCollection.new 4 end 5end

今回知りたいのは、Cooking/newを呼んだ時に、Materialsコントローラーのnewアクションを呼び出す方法、またそれ以外の代替策です。
長くなりましたが、ここまで読んでいただきありがとうございます。
お力いただけると大変助かります。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

すみません、前回の私の回答この辺りが不親切でした
Rails 複数の子レコードの作成・更新を自在に扱う
has_manyで関連づけられたモデルも一括保存する方法
この辺りに詳しく書かれています

投稿2019/12/18 21:22

winterboum

総合スコア23329

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

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

kosuke_ikeura

2019/12/19 08:02

いつもありがとうございます。 無事に解決しました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問