前提・実現したいこと
Railsで冷蔵庫管理システムを作ろうと挑戦しています。個人冷蔵庫(refrige)に食材(food)を複数入力し複数のレコードを、一括で保存したいと考えています。
■■最終的には、フォームの全部に入力している場合にのみ保存ではなく。食材名(:food_name)の欄への記述があるもののみ保存したいです。■■
■■画面でエラーは出ず、保存されない状態です。現在はパラメーターまではデータが届いているようですが、保存されません。@formにfood_idとrefrige_idが渡っていないのが問題です■■
日付がnilになっていた件は解決しました!!(カレンダーから選択にしたらnilが解消しました)
発生している問題・エラーメッセージ
●food_collection_paramsの中身
12: def create
13: byebug
=> 14: @form = Form::FoodCollection.new(food_collection_params)
15: if @form.save
16: redirect_to refrige_foods_path
17: else
(byebug) food_collection_params
<ActionController::Parameters {"foods_attributes"=><ActionController::Parameters {"0"=><ActionController::Parameters {"food_name"=>"ああああ", "product_name"=>"あああああ", "category_id"=>"3", "purchase_date"=>"111111", "sell_by"=>"33333", "shop"=>"ああああ"} permitted: true>, "1"=><ActionController::Parameters {"food_name"=>"いいいい", "product_name"=>"いいいいい", "category_id"=>"6", "purchase_date"=>"222222", "sell_by"=>"22222", "shop"=>"いいいい"} permitted: true>} permitted: true>, "refrige_id"=>"1"} permitted: true>
●@formの中身
12: def create
13: byebug
14: @form = Form::FoodCollection.new(food_collection_params)
=> 15: if @form.save
16: redirect_to refrige_foods_path
17: else
18: flash.now[:alert]
19: render :new
(byebug) @form
<Form::FoodCollection:0x00007fd2c17663d0 @foods=[#<Food id: nil, food_name: "ああああ", product_name: "あああああ", category_id: 3, purchase_date: "0011-11-11", sell_by: nil, shop: "ああああ", refrige_id: nil, created_at: nil, updated_at: nil>, #<Food id: nil, food_name: "いいいい", product_name: "いいいいい", category_id: 6, purchase_date: nil, sell_by: nil, shop: "いいいい", refrige_id: nil, created_at: nil, updated_at: nil>], @refrige_id="1">
#該当コード
該当のソースコード
●foodテーブル●
class CreateFoods < ActiveRecord::Migration[6.0] def change create_table :foods do |t| t.string :food_name, null: false t.string :product_name t.integer :category_id, null: false t.date :purchase_date, null: false t.date :sell_by t.string :shop t.references :refrige, foreign_key: true t.timestamps end end end html
●foodモデル●
class Food < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :category with_options presence: true do validates :food_name validates :purchase_date validates :refrige_id end validates :genre_id, numericality: { other_than: 1 } belongs_to :refrige, validate: false end
●foodcollectionモデル●
class Form::FoodCollection < Form::Base FORM_COUNT = 2 attr_accessor :foods, :refrige_id def initialize(attributes = {}) super attributes self.foods = FORM_COUNT.times.map { Food.new } unless foods.present? end def foods_attributes=(attributes) self.foods = attributes.map { |_, v| Food.new(v) } end def save Food.transaction do foods.map do |food| food.save if food.food_name end rescue => e false end end
●foods コントローラー●
def new @form = Form::FoodCollection.new end def create byebug @form = Form::FoodCollection.new(food_collection_params) if @form.save redirect_to refrige_foods_path else render :new end end private def food_collection_params params.require(:form_food_collection) .permit(foods_attributes: [:food_name, :product_name, :category_id, :purchase_date, :sell_by, :shop],).merge(refrige_id: params[:refrige_id]) end
試したこと
@formにfood_idとrefrige_idがnilになっている事。
attr_accessor :foods, :refrige_id への記述。ストロングパラメーターにも.merge(refrige_id: params[:refrige_id])の記述をしましたが変わりません。
まとめずに1レコードずつの保存はできました。@formにfood_idとrefrige_idの渡し方分かる方いらっしゃいませんでしょうか。
補足情報(FW/ツールのバージョンなど)
こちらの記事を参考にさせていただきました。
ど素人です。不明な点や、至らない記述があれば追加します。よろしくお願いします。
【Rails 5】モデルを一括登録する手順
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/10 00:47 編集
2020/12/10 01:25 編集
2020/12/10 02:16
2020/12/10 02:33