前提・実現したいこと
初歩的な質問かと思いますが御教授いただけたら助かります。
現在レシピ投稿サイト作成中です。
レシピ投稿の際にFormオブジェクトを使い、一つのフォームから2つのデータベースにそれぞれ保存できるようにしました。①menusテーブル(メニュー名.作り方)②food_stuffsテーブル(材料・分量.栄養素 等)です
menusテーブルとfood_stuffテーブルは1対1の関係です
## menus テーブル | Column | Type | Options | | ---------------------- | ------------- | ------------------------------ | | title | string | null: false | | recipe | text | null: false | | user | references | null: false, foreign_key: true | ### Association - has_one :food_stuff - belongs_to :user ## food_stuffs テーブル | Column | Type | Options | | ---------------- | ------------- | ------------------------------ | | meet_id | integer | | | meet_quantity | integer | | | fish_id | integer | | | fish_quantity | integer | | | vege_id | integer | | | vege_quantity | integer | | | dairy_id | integer | | | dairy_quantity | integer | | | total_p | integer | | | total_f | integer | | | total_c | integer | | | etc_food | integer | null: false | | menu_id | references | null: false, foreign_key: true | ### Association - belongs_to :menu
このformオブジェクトを採用した際の
編集(edit.update)がどうしても上手くいきません
発生している問題・エラーメッセージ
該当のソースコード
<menus_controller>
ruby
1class MenusController < ApplicationController 2 3 def index 4 @menus = Menu.all.order("created_at DESC") 5 end 6 7 def new 8 @menu_food_stuff = MenuFoodStuff.new 9 end 10 11 def create 12 @menu_food_stuff = MenuFoodStuff.new(menu_params) 13 if @menu_food_stuff.valid? 14 @menu_food_stuff.save 15 else 16 render :new 17 end 18 end 19 20 def show 21 @menu = Menu.find(params[:id]) 22 @food_stuff = FoodStuff.find_by(menu_id: @menu.id) 23 end 24 25def edit 26 @menu = Menu.find(params[:id]) 27 @food_stuff = FoodStuff.find_by(menu_id: @menu.id) 28 @menu_food_stuff = MenuFoodStuff.find_by(title: @menu.title, meet_id: @food_stuff.meet_id, meet_quantity: @food_stuff.meet_quantity, fish_id: @food_stuff.fish_id, fish_quantity: @food_stuff.fish_quantity, vege_id: @food_stuff.vege_id, vege_quantity: @food_stuff.vege_quantity, dairy_id: @food_stuff.dairy_id, dairy_quantity: @food_stuff.dairy_quantity, etc_food: @food_stuff.etc_food, recipe: @menu.recipe, ) 29 end 30 31 def update 32 end 33 34 def destroy 35 end 36 37 private 38 def menu_params 39 params.require(:menu_food_stuff).permit(:title, :image, :recipe, :meet_id, :meet_quantity, :fish_id, :fish_quantity, :vege_id, :vege_quantity, :dairy_id, :dairy_quantity, :etc_food, :total_p, :total_f, :total_c).merge(user_id: current_user.id) 40 end 41 end
<menu_food_stuff.rb> ※formオブジェクト
class MenuFoodStuff include ActiveModel::Model attr_accessor :image, :title, :recipe, :meet_id, :meet_quantity, :fish_id, :fish_quantity, :vege_id, :vege_quantity, :dairy_id, :dairy_quantity, :total_p, :total_f, :total_c, :etc_food, :user_id, :menu_id with_options presence: true do validates :image, :etc_food, :user_id validates :title, length: { maximum: 20 } validates :recipe, length: { maximum: 100 } end def save menu = Menu.create(image: image, title: title, recipe: recipe, user_id: user_id) FoodStuff.create(meet_id: meet_id, meet_quantity: meet_quantity, fish_id: fish_id, fish_quantity: fish_quantity, vege_id: vege_id, vege_quantity: vege_quantity, dairy_id: dairy_id, dairy_quantity: dairy_quantity, total_p: total_p, total_f: total_f, total_c: total_c, etc_food: etc_food, menu_id: menu.id) end end
<routes.rb>
Rails.application.routes.draw do devise_for :users root to: 'menus#index' resources :menus resources :users, only: :show end
試したこと
menusコントローラー内のeditアクションにて
@menu = Menu.find(params[:id]) @food_stuff = FoodStuff.find_by(menu_id: @menu.id) @menu_food_stuff = MenuFoodStuff.new(title: @menu.title, meet_id: @food_stuff.meet_id, meet_quantity: @food_stuff.meet_quantity, fish_id: @food_stuff.fish_id, fish_quantity: @food_stuff.fish_quantity, vege_id: @food_stuff.vege_id, vege_quantity: @food_stuff.vege_quantity, dairy_id: @food_stuff.dairy_id, dairy_quantity: @food_stuff.dairy_quantity, etc_food: @food_stuff.etc_food, recipe: @menu.recipe, )
で新規フォームで値を予めセットしておく方法でも試してみましたが
編集からの更新という形ではなく、同じ内容のものを重ねての投稿となってしまします
詳細画面もクリアはできてますがこのようにテーブルごとに別の変数(@menuと@food_stuff)を定義してから表示させるのがいいのか?
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。