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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

0回答

352閲覧

ActiveAdminで一対一のリレーションされたモデルを同時に更新したい

stks56

総合スコア15

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2019/03/15 18:11

環境
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が挿入されてしまう。

ずっとこの部分で詰まっているのでご教示頂けますと幸いです。
気づいた点だけでも構いません、どうかよろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問