やりたいこと
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にしてから行っています。
しかし、削除にバリデーションを加えたくていろいろ試しましたがダメでした。
編集画面から子モデルの削除をする際のバリデーションの掛け方をご存知の方がいらっしゃいましたらお力添えいただけたらと思います。何卒よろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。