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

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

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

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

Q&A

解決済

1回答

623閲覧

別々のテーブルで同一カラム名のデータを一度の操作で両方のテーブルに保存する方法

kokitail

総合スコア135

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/07 10:19

編集2020/04/08 01:05

前提・実現したいこと

【Rails でのフォーム実装】

■ 実現したいこと
1回のフォーム投稿で複数のテーブルにデータを保存したい。

■ 現状
・form_withメソッドを使用
・要約テーブル(titleカラム、contentカラム)と感想テーブル(contentカラム)に入力データを保存したい。

発生している問題・エラーメッセージ

・要約テーブル(Summary)と感想テーブル(Review)で一緒のカラム名があるため、form_withメソッド内でname属性が被ってしまう。
・name属性が被らないようにsummary_content、review_contentとすると、createアクションで受け取る時にキー名とカラム名が一致せず保存ができない。

該当のソースコード

haml

1-# 入力フォーム 2= form_with(model: [@book, @note], local: true) do |f| 3 .summary-form 4 = f.text_field :summary_title, placeholder: "見出しを入力してください", class: "summary-title-form" 5 = f.text_field :summary_content, placeholder: "要約を入力してください", class: "summary-content-form" 6 .review-form 7 = f.text_field :review_content, placeholder: "感想を入力してください", class: "review-form" 8 .submit-btn-form 9 = f.submit "保存"

Ruby

1# コントローラ 2def create 3 @summary = Summary.create(summary_params) 4 @review = Review.create(review_params) 5 redirect_to root_path 6end 7 8private 9 def review_params 10 params.require(:note).permit(:review_content) 11 end 12 13 def summary_params 14 params.require(:note).permit(:summary_content) 15 end 16end

Ruby

1# 各モデル 2 3class Book < ApplicationRecord 4 has_many :notes 5end 6 7class Note < ApplicationRecord 8 belongs_to :book 9 has_many :summaries 10 has_many :reviews 11end 12 13class Summary < ApplicationRecord 14 belongs_to :note 15end 16 17class Review < ApplicationRecord 18 belongs_to :note 19end 20

試したこと

・private内でキー名を変更してcreateアクションに渡せばよいかと思いましたが、簡単にキー名を変更できるメソドが探せずどうすればスマートか教えていただきたいです。

補足

ここで登場するのは4つのテーブルです。
1.booksテーブル
2.notesテーブル
3.summariesテーブル
4.reviewsテーブル

一つのbookに対して多くのnote、さらにそこからsummaryとreviewが枝分かれするイメージです。

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

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

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

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

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

winterboum

2020/04/07 23:11

同時に登録したいということは二つのtableの間に関連があるのでしょう。 二つのmodelのその部分の定義を載せてください
guest

回答1

0

自己解決

fields_forを使ってテーブル毎のフォームを作ることで解決しました。

投稿2020/04/10 09:50

kokitail

総合スコア135

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問