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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

809閲覧

Formオブジェクトを使って2つのテーブルに保存したデータを編集したい

yasu0205

総合スコア4

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/05/05 16:50

編集2021/05/05 18:56

前提・実現したいこと

初歩的な質問かと思いますが御教授いただけたら助かります。

現在レシピ投稿サイト作成中です。
レシピ投稿の際に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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

自己解決

form_forにすることで編集可能にしました

投稿2021/05/18 19:45

yasu0205

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問