前提・実現したいこと
楽曲とその音源を登録するアプリを作っています。1つの曲に対し複数の演奏音源がつきます。親モデルはpostで、子モデルはrecordingです。
button_toで楽曲ページに表示されている子モデルのデータをチェックボックスを通して一括削除したいですが、IDの指定が上手くいきません。
発生している問題・エラーメッセージ
任意のrecordingのデータのチェックボックスにチェックを入れてDeleteボタンを押すとこうなります。
Couldn't find all Posts with 'id': (1, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 34, 35, 36) (found 5 results, but was looking for 21). def delete_multiple @recording = Post.find(params[:id]).recording.where(id: params[:recording_ids]) @recording.destroy_all end
該当のソースコード
rails
1 2Postモデル(親) 3 4class Post < ApplicationRecord 5 has_many :recordings, dependent: :destroy 6 has_many :post_instruments 7 accepts_nested_attributes_for :recordings, {allow_destroy: true} 8end 9 10Recordingモデル(子) 11 12class Recording < ApplicationRecord 13 belongs_to :post 14end 15 16ビュー(posts/show.html.erb) 17 18<% @post.recordings.each do |recording| %> 19 <%= check_box_tag "recording_ids[]", recording.id %> 20<% end %> 21 22<%= button_to "Delete", {action: "delete_multiple", id: @post.recording_ids,} method: :delete %> 23 24Postコントローラ 25 26 def delete_multiple 27 @post= Post.find(params[:id]).recordings.where(id: params[:recording_ids]).destroy_all 28 redirect_to('/posts/') 29 end 30 31ルーティング 32 33Rails.application.routes.draw do 34 35 resources :posts do 36 resources :recordings 37 38 collection do 39 get :'index' 40 delete :'delete_multiple' 41 end 42 end 43end 44 45 46
試したこと
指定するべきIDはあくまでrecordingモデルのIDであって、postモデルのIDではないというのは分かるのですが、そこからどうすればいいのか分かりませんでした。
Recordingコントローラにも同じようなdelete=multipleモデルを作って、button_toにおいてコントローラをcontroller: :recordingsに指定しても、使われるのはpostコントローラの方のメソッドです。
そのほかbutton=toの{}の構成などを入れ替えてたりしました。
いくつかのウェブページも参考にしました。
https://stackoverflow.com/questions/28360663/delete-multiple-records-using-checkboxes-in-rails
https://stackoverflow.com/questions/22443064/rails-destroy-multiple-record-through-check-boxes
補足情報(FW/ツールのバージョンなど)
rails 6.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/01 14:02 編集
2020/05/01 14:07 編集