料理を投稿できるサービスを作っています。
とてもセンスのないデザインですが、このようなフォームで料理を投稿できるサービスを作っています。
そこで、Material(材料)の項目が、材料と分量という2つカラムがあるかつ、複数のデータを投稿する必要があります。複数のデータを一括で登録する方法はわかりました。
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アクションを呼び出す方法、またそれ以外の代替策です。
長くなりましたが、ここまで読んでいただきありがとうございます。
お力いただけると大変助かります。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/19 08:02