環境
Ruby 2.4.0
Ruby on Rails 5.2.2
MySQL 5.6.43
Ruby on Railsでwebアプリを作っているのですが
親モデルが存在するとき、必ず子モデルが一つだけ存在する。
親モデルが削除されたとき、小モデルも同時に削除される。
という関係を表現しています。
親モデル(Game)
class Game < ApplicationRecord validates :name, {presence: true} has_many :posts has_one :game_image, dependent: :destroy accepts_nested_attributes_for :game_image, allow_destroy: true end
※postsは関係ありません
小モデル(GameImage)
class GameImage < ApplicationRecord belongs_to :game mount_uploader :icon_image_name, ImageUploader mount_uploader :background_image_name, ImageUploader end
DB設計(db/schema.rb)
create_table "game_images", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.bigint "game_id" t.string "icon_image_name" t.string "background_image_name" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["game_id"], name: "index_game_images_on_game_id" end create_table "games", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ add_foreign_key "game_images", "games"
Gameが存在するとき、それに対応するゲーム画像を管理するテーブルGameImageが一つ存在するといった感じです。(画像アップローダにはcarrierwaveを使用しています)
そこでActiveAdminのGameの作成ページ、編集ページにもそのGameに対応するGameImageも編集できる状態にしたく、以下のコードを書きました。
ActiveAdmin.register Game do permit_params :name, game_image_attributes: [:icon_image_name, :background_image_name] form(:html => { :multipart => true }) do |f| f.inputs 'ゲーム名' do f.input :name end f.inputs "ゲーム画像", :for => [:game_image, f.object.game_image || GameImage.new(icon_image_name: "default.jpg", background_image_name: "default.jpg")] do |game_image| game_image.input :icon_image_name, :image_preview => true game_image.input :background_image_name, :image_preview => true end f.actions end end
このコードでのページは以下のとおりです。
作成ページ
編集ページ
一見うまくいっているように見えますが、以下の問題があります。
0. 編集ページで画像を変更したとき親モデルに対応する小モデルが更新されず新しく作られてしまう。
0. 作成ページでゲーム名だけ入力して画像を選択しなかった場合default.jpgを小モデルに設定したいがレコード自体作られない。
0. 編集ページで画像を編集しなかった場合、前回の画像を保持して欲しいが前回のレコードが削除され、新しくレコードが作られ、NULLが挿入されてしまう。
ずっとこの部分で詰まっているのでご教示頂けますと幸いです。
気づいた点だけでも構いません、どうかよろしくお願いします。
あなたの回答
tips
プレビュー