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

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

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

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

3回答

1229閲覧

複数モデルの登録時にValidationエラーとなる

runes224

総合スコア14

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2019/06/22 11:55

前提・実現したいこと

2つのレコードを同時登録をしたいのですがうまくいきません。
複数レコードを登録する際にエラーが出ます。

ActiveRecord::RecordInvalid (Validation failed: Directions recipe must exist):

5時間以上かけて解決しようと色々と調べているのですが解決しません。ご協力よろしくお願いします!!!

model

ruby

1class Recipe < ApplicationRecord 2 has_many :directions, -> { order("number ASC") }, dependent: :destroy 3 accepts_nested_attributes_for :directions 4 belongs_to :user 5end 6 7class Direction < ApplicationRecord 8 belongs_to :recipe 9 validates :recipe_id, presence: true 10 validates :number, presence: true 11 validates :content, presence: true 12end 13 14class User < ApplicationRecord 15 has_many :recipes 16 before_save { self.email = email.downcase } 17 validates :name, presence: true, length: { maximum: 50 } 18 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(.[a-z\d\-]+)*.[a-z]+\z/i 19 validates :email, presence: true, length: { maximum: 255 }, 20 format: { with: VALID_EMAIL_REGEX }, 21 uniqueness: { case_sensitive: false } 22 has_secure_password 23 validates :password, presence: true, length: { minimum: 6 } 24end

View

html

1<% provide(:title, 'Create Recipe') %> 2<h1>レシピを作成する</h1> 3<div class="row"> 4 <div class="col-md-6 col-md-offset-3"> 5 <%= form_for @recipe do |f| %> 6 <%= f.label :name %> 7 <%= f.text_field :name, class: 'form-control' %> 8 <%= f.label :description %> 9 <%= f.text_field :description, class: 'form-control' %> 10 <%= f.fields_for(:directions) do |d| %> 11 <%= d.label :number %> 12 <%= d.number_field :number %> 13 <%= d.label :content %> 14 <%= d.text_field :content %> 15 <% end %> 16 <%= f.submit "Create Recipe", class: "btn btn-primary" %> 17 <% end %> 18 </div> 19</div>

Controller

ruby

1class RecipesController < ApplicationController 2 3 def new 4 @recipe = Recipe.new 5 @recipe.directions.build 6 end 7 8 def create 9 @recipe = current_user.recipes.build(recipe_params) 10 @recipe.save! 11 redirect_to root_path 12 end 13 14 private 15 16 def recipe_params 17 params.require(:recipe).permit(:name, :description, directions_attributes: [:number, :content]) 18 end 19end

環境

  • Docker version 18.09.2
  • docker-compose version 1.23.2
  • ruby 2.5.5
  • Rails 5.2.3

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

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

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

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

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

guest

回答3

0

自己解決

https://qiita.com/iguchi1124/items/218e35a145f372062ea4

上の記事を参考にして、解決しました。

Rails5以降、外部キーにデフォルトでNOT nil制約が適用されているようです。
belongs_to :user, optional: trueに変更して解決しました。

ありがとうございました!

投稿2019/06/22 23:37

runes224

総合スコア14

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

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

0

Rails 5 ですね?5では has_*、belongs_to の関係は必ず双方が無いとvalidationではねられます。
codeを見た所では 一緒に作っているのでこのエラーがでるのがはてなです。
見落としあるかなぁ、、、

ActiveRecord::RecordInvalid (Validation failed: Directions recipe must exist):

このエラーのまえに、Direction の作成に失敗していたししませんか?
logを確認して下さい。
INSERT の前後が BEGIN。。。COMMIT でなく BEGIN...ROLLBACK になっていないか?

もしかすると
validates :recipe_id, presence: true
が余分かもしれないです

投稿2019/06/22 23:20

winterboum

総合スコア23347

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

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

0

Validation failed: Directions recipe must exist

Recipeが必要と言われているように見えますね ????

accepts_nested_attributes_for を使う時には、子モデルに対して親モデルのidを持たせてあげる必要があります。

他にも原因はあるかもですがひとまず、ストロングパラメーターにid含めてあげるとどうでしょうか?

def recipe_params params.require(:recipe).permit(:name, :description, directions_attributes: [:id, :number, :content]) end

投稿2019/06/22 12:00

t_kusakabe74

総合スコア549

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問