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

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

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

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

Q&A

解決済

1回答

1468閲覧

railsで子モデルを作成(一時的?)し親モデルのnewページに表示したい

yuta66jp

総合スコア11

Ruby on Rails

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

0グッド

0クリップ

投稿2020/03/09 15:07

前提・実現したいこと

railsの練習として、ダイエットサイトを作成しております。
日記の中に、食事記録(別テーブル)を複数記録し日記の作成ができる仕組みを作成しております。
その際、日記の新規作成画面から食事記録新規登録画面に遷移し食事記録を登録したら日記の新規作成画面に戻り(その際に登録した食事内容を表示したい)、日記作成ボタンを押したら、食事記録と日記が作成できるようにしたいです。

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

食事記録を日記を作成する前(日記新規画面)に作成したいのですが、日記との親子関係を関連付けしているためか、日記を作成しなければ登録できません。
現在、食事記録と同時に日記を作成するようにいたしましたが、本来は、食事記録を日記の新規ページに表示し日記の作成をしたいです。
長くなりましたが、教えていただけますでしょうか。

ruby

1class DiariesController < ApplicationController 2 3 def new 4 # viewへ渡すためのインスタンス変数に空のモデルオブジェクトを作成 5 @diary = Diary.new 6 @body_weight = BodyWeight.new 7 end 8 9 def create 10 # build=モデルオブジェクトを生成(newの別名) 11 @diary = current_user.diaries.build(diary_params) 12 @diary.save 13 14 # body_weight作成 15 @body_weight = @diary.build_body_weight( 16 user_id: current_user.id, 17 weight_record: params[:diary][:body_weight][:weight_record] 18 ) 19 @body_weight.save 20 21 redirect_to diary_path(@diary.id) 22 end 23 24 25

ruby

1 2class MealRecordsController < ApplicationController 3 4 def new 5 @meal_record = MealRecord.new 6 7 #binding.pry 8 end 9 10 def create 11 @meal_record = MealRecord.new(meal_record_params) 12 @diary = current_user.diaries.build 13 @diary.save 14 @meal_record[:diary_id] = @diary.id 15 @meal_record.save 16 redirect_to new_diary_path 17 end

ruby

1<h1>新規投稿</h1> 2 3<%= link_to "追加する", new_meal_record_path %> 4 5 6 7<%= form_with model: @diary do |f| %> 8 9 <h3>メモ</h3> 10 <%= f.text_area :remark %> 11 12 <%= f.fields_for @body_weight do |weight| %> 13 <h3>体重</h3> 14 <%= weight.number_field :weight_record, min: 0 %> 15 <% end %> 16 17 <h3>活動量</h3> 18 <%= f.select :activity_status, Diary.activity_statuses.keys.to_a, prompt: "選択してください" %> 19 20 <%= f.submit "投稿" %> 21 22<% end %> 23 24

ruby

1<h1>新規投稿</h1> 2 3<%= form_with model: @meal_record, url: meal_records_path do |f| %> 4 5 6 <h3>食事画像</h3> 7 <%= f.attachment_field :meal_image %> 8 9 <h3>タイトル</h3> 10 <%= f.text_field :title %> 11 12 13 <h3>本文</h3> 14 <%= f.text_area :body %> 15 16 <h3>いつ食べましたか</h3> 17 <%= f.select :intake_status, MealRecord.intake_statuses.keys.to_a, prompt: "選択してください" %> 18 19 <%= f.submit "追加" %> 20 21<% end %> 22 23

ruby

1class MealRecord < ApplicationRecord 2 3 # アソシエーション設定 4 belongs_to :diary 5 6 # attachmentメソッド(gem:refile)使用 7 attachment :meal_image 8 9 # enum機能の定義 10 enum intake_status: { その他: 0, 朝食: 1, 昼食: 2, 夕食: 3, 間食: 4 } 11 12end 13 14

ruby

1class Diary < ApplicationRecord 2 3 # アソシエーション設定 4 belongs_to :user 5 has_one :body_weight 6 has_many :meal_records, dependent: :destroy 7 8 # enum機能の定義 9 enum activity_status: { 低い: 0, 普通: 1, 高い: 2 } 10 11 end 12

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

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

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

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

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

guest

回答1

0

ベストアンサー

食事記録を日記を作成する前(日記新規画面)に作成したいのですが、日記との親子関係を関連付けしているためか、日記を作成しなければ登録できません。

アソシエーション(has_many belongs_to)を設定しているために上記のような動作となっています。

本来は、食事記録を日記の新規ページに表示し日記の作成をしたいです。


【質問の回答】

optional: trueを使うと関連付けされたオブジェクトの存在性のバリデーションが実行されないようになります。

Railsガイド:option
Railsのbelongs_toに指定できるoptional: trueとは?


【注意点】

アソシエーションを設定することによってデータの整合性を担保しています。
そのためoption:trueを利用する際の設計は十分注意して行う必要があるかと思います。


【その他の案】

option:trueを利用すると、データの整合性が取れなくなる可能性があるので
0. 日記の新規作成ボタンからdiarycreateする。
0. 日記のバリデーションは、createの場合はなし、更新のときのみ必須とする(on: :updateを利用)
0. diaryコントローラーcreateアクションのリダイレクト先を食事記録にする。
0. meal_recordコントローラーのcreateアクションのリダイレクト先を、日記のeditページにする。

みたいに実装をすすめると思います。

投稿2020/03/10 01:07

no1knows

総合スコア3365

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

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

yuta66jp

2020/03/10 03:01

回答ありがとうございます! 提案頂いた流れで作成することができました! 1点質問ですが、現状提案頂いた2.の部分をせずに日記の作成ができております。親モデルだからでしょうか。
no1knows

2020/03/10 08:49

作成することができてよかったです! バリデーションは設計次第なのでなくても大丈夫ですが、本来はあったほうがいいと思います。 バリデーションを使わないと日記が何も記入していない状態で保存ができてしまうのではないでしょうか? https://railsguides.jp/active_record_validations.html
yuta66jp

2020/03/11 09:38

コメントありがとうございます! railsガイドの:onについて確認させていただき理解できました! :onオプション初めて知ることができました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問