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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

792閲覧

【accepts_nested_attributes_for】登録時に子レコードの判定と親IDの取得をしたい

pecchan

総合スコア587

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/07/12 19:57

編集2021/07/12 20:11

rails6.1.0

商品登録ページを修正してます。
商品は複数の画像を持ちます。

「carriewave」の利用をやめることになり、画像に関する部分を作り直してる所です。

商品の登録時に
・画像が、「新規か変更か削除か」判定する必要があります。
・画像に、親のid(商品id)を持たせる必要があります。

このような条件ですが
「before_save」
を使うと、まだ確定前なので「画像が新規か変更か」など子レコードの判定はできますが、商品idはまだ取得できません。

「after_save」
を使うと、確認後なので商品idは取得できますが、逆に子レコードの判定が出来なくなりました。

両方を満たしたい場合、どうする方法があるのでしょうか?
初心者につき勘違いしてる部分があったらすいません。

先輩方アドバイスいただけると幸いです。
宜しくお願い致します。

【補足】
子に親のid(商品id)を持たせたいのは、保存ディレクトリに親idを含めるためです。

\app\models\item.rb

ruby

1class Item < ApplicationRecord 2 before_save :s3_copy_image 3 4 has_many :images, dependent: :destroy 5 accepts_nested_attributes_for :images, allow_destroy: true 6 7 8 # imageが変更されたかどうか 9 def images_changed? 10 self.images.any? do |img| 11 img.new_record? || img.changed? || img.marked_for_destruction? 12 end 13 end 14 15 16 def s3_copy_image 17 18 if images_changed? 19 images.each do |img| 20 if img.new_record? 21 target_key = "uploads/image-develop/src/#{self.id}/#{File.basename(img.src)}" 22 # 以下からS3操作なので省略 23 end 24 end 25 end 26 27end

\app\models\image.rb

ruby

1class Image < ApplicationRecord 2 #mount_uploader :src, ImageUploader 3 4 belongs_to :item, optional: true 5 6 validates :src, presence: true 7end 8

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

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

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

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

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

guest

回答1

0

ベストアンサー

accepts_nested_attributes_for でまとめて始末するのでは駄目なのでは。
まず親をsaveしついで子をsaveするという二段階を踏む必要が有るのでは。

投稿2021/07/12 23:02

winterboum

総合スコア23416

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

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

pecchan

2021/07/12 23:10

お早う御座います。 まさに今そこに辿りいついて凹んでるところでした(笑) if item.save? image.save end こんな感じにしたいと無理ですね 有難う御座いました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問