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

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

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

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

Ruby on Rails

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

Q&A

1回答

2292閲覧

編集画面にて子モデルの要素を削除する際にバリデーションを掛けたい

ohoh5454

総合スコア92

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

1クリップ

投稿2021/06/13 16:32

編集2021/06/13 23:52

やりたいこと

parentモデルとkidモデルがhas_manyの関係で存在するとして、parentの編集画面にてkidsを削除するときにバリデーションを掛けたい。バリデーションの内容はkidsのstatusによってdestroyの可否を決める。
kidsのstatusはdefaultで0が入っていて、1の場合削除できなくする。
子モデルの作成にはcocoonを使っています。

試したこと

rails

1#parent.rb 2has_many :kids 3accepts_nested_attributes_for :kids, allow_destroy: true

rails

1#kid.rb 2belongs_to :parent 3 4before_destroy :status_validation 5 6privarte 7 def destroy_status_validate 8 if self.status == 1 9 errors.add :base, "#{self.name}は削除できません" 10 throw :abort 11 #throw :abortではなくreturn flaseをしたらdestroyされてしまう。 12 end 13 end

rails

1#parents_controller.rb 2def update 3 @parent = parent.find(params[:id]) 4 if @parent.update(parent_params) #ここで処理が止まってエラーになる 5 redirect_to parents_url, notice: '更新成功' 6 else 7 flash.now[:danger] = @parent.errors.full_messages 8 render :edit 9 end 10end 11 12#エラー内容 13ActiveRecord::RecordNotDestroyed (Failed to destroy the record) 14 15#パラメーター 16"parent"=> 17{"name"=>"sato", 18  "sex"=>"man", 19 "age"=>"50", 20 "kids_attributes"=> 21 {"0"=>{"name"=>"taro", "_destroy"=>"false", "id"=>"17"}, 22 "1"=>{"name"=>"ichiro", "_destroy"=>"false", "id"=>"18"}, 23 "2"=>{"name"=>"megumi", "_destroy"=>"false", "id"=>"19"}, 24 "3"=>{"name"=>"yuko", "_destroy"=>"1", "id"=>"27"}}}, 25 "commit"=>"保存", 26 "id"=>"12"}

現状、編集画面にてkidの追加、編集は可能。削除もバリデーションを加えなければ動きます。
削除動作を確かめる際はconsoleにてstatusを1にしてから行っています。
しかし、削除にバリデーションを加えたくていろいろ試しましたがダメでした。
編集画面から子モデルの削除をする際のバリデーションの掛け方をご存知の方がいらっしゃいましたらお力添えいただけたらと思います。何卒よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

def destroy_status_validate では kid にerrorが立ちますが pareteにerrorが立たないので通ってしまうのでしょう。

「こうすればできる」というものを知らないのでいくつかの案を。
案1 validates_associated を使う。ただ parent には なにか起きたということは伝わりますが、どんなエラーかは伝わりません
案2 destroy の前に kidsを舐めて、削除出来ないのがあればそこでエラー処理する
案3 例外を立てrescue でエラー処理する

案1はうまく行くかわかりません。案2,3なら確実に出来ます。
案2を行うなら、controllerではなく model に method destroyable? でも作ることを薦めます。

投稿2021/06/14 15:15

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問