From c399f7d07a88d333fa05a361c66a252d9fa462bb Mon Sep 17 00:00:00 2001
From: George Claghorn <george.claghorn@gmail.com>
Date: Sun, 17 Mar 2019 17:22:46 -0400
Subject: Fix updating rich text via nested attributes

Closes #35159.
---
 actiontext/lib/action_text/attribute.rb                  |  7 ++-----
 actiontext/test/dummy/app/models/message.rb              |  3 +++
 actiontext/test/dummy/app/models/review.rb               |  5 +++++
 .../dummy/db/migrate/20190317200724_create_reviews.rb    |  8 ++++++++
 actiontext/test/dummy/db/schema.rb                       |  8 +++++++-
 actiontext/test/unit/model_test.rb                       | 16 +++++++++++++++-
 6 files changed, 40 insertions(+), 7 deletions(-)
 create mode 100644 actiontext/test/dummy/app/models/review.rb
 create mode 100644 actiontext/test/dummy/db/migrate/20190317200724_create_reviews.rb

(limited to 'actiontext')

diff --git a/actiontext/lib/action_text/attribute.rb b/actiontext/lib/action_text/attribute.rb
index f226dd21bd..f9a604096c 100644
--- a/actiontext/lib/action_text/attribute.rb
+++ b/actiontext/lib/action_text/attribute.rb
@@ -34,14 +34,11 @@ module ActionText
           end
         CODE
 
-        has_one :"rich_text_#{name}", -> { where(name: name) }, class_name: "ActionText::RichText", as: :record, inverse_of: :record, dependent: :destroy
+        has_one :"rich_text_#{name}", -> { where(name: name) },
+          class_name: "ActionText::RichText", as: :record, inverse_of: :record, autosave: true, dependent: :destroy
 
         scope :"with_rich_text_#{name}", -> { includes("rich_text_#{name}") }
         scope :"with_rich_text_#{name}_and_embeds", -> { includes("rich_text_#{name}": { embeds_attachments: :blob }) }
-
-        after_save do
-          public_send(name).save if public_send(name).changed?
-        end
       end
     end
   end
diff --git a/actiontext/test/dummy/app/models/message.rb b/actiontext/test/dummy/app/models/message.rb
index 9ea4dbfe78..7bce50753c 100644
--- a/actiontext/test/dummy/app/models/message.rb
+++ b/actiontext/test/dummy/app/models/message.rb
@@ -1,4 +1,7 @@
 class Message < ApplicationRecord
   has_rich_text :content
   has_rich_text :body
+
+  has_one :review
+  accepts_nested_attributes_for :review
 end
diff --git a/actiontext/test/dummy/app/models/review.rb b/actiontext/test/dummy/app/models/review.rb
new file mode 100644
index 0000000000..e54a37685d
--- /dev/null
+++ b/actiontext/test/dummy/app/models/review.rb
@@ -0,0 +1,5 @@
+class Review < ApplicationRecord
+  belongs_to :message
+
+  has_rich_text :content
+end
diff --git a/actiontext/test/dummy/db/migrate/20190317200724_create_reviews.rb b/actiontext/test/dummy/db/migrate/20190317200724_create_reviews.rb
new file mode 100644
index 0000000000..96e0eab287
--- /dev/null
+++ b/actiontext/test/dummy/db/migrate/20190317200724_create_reviews.rb
@@ -0,0 +1,8 @@
+class CreateReviews < ActiveRecord::Migration[6.0]
+  def change
+    create_table :reviews do |t|
+      t.belongs_to :message, null: false
+      t.string :author_name, null: false
+    end
+  end
+end
diff --git a/actiontext/test/dummy/db/schema.rb b/actiontext/test/dummy/db/schema.rb
index 60ccbd4873..03e99b29d2 100644
--- a/actiontext/test/dummy/db/schema.rb
+++ b/actiontext/test/dummy/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2019_03_05_172303) do
+ActiveRecord::Schema.define(version: 2019_03_17_200724) do
 
   create_table "action_text_rich_texts", force: :cascade do |t|
     t.string "name", null: false
@@ -61,5 +61,11 @@ ActiveRecord::Schema.define(version: 2019_03_05_172303) do
     t.datetime "updated_at", precision: 6, null: false
   end
 
+  create_table "reviews", force: :cascade do |t|
+    t.integer "message_id", null: false
+    t.string "author_name", null: false
+    t.index ["message_id"], name: "index_reviews_on_message_id"
+  end
+
   add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
 end
diff --git a/actiontext/test/unit/model_test.rb b/actiontext/test/unit/model_test.rb
index d56363adc0..f4328ba2ce 100644
--- a/actiontext/test/unit/model_test.rb
+++ b/actiontext/test/unit/model_test.rb
@@ -49,8 +49,22 @@ class ActionText::ModelTest < ActiveSupport::TestCase
     assert_equal "Hello world", message.content.to_plain_text
   end
 
-  test "save body" do
+  test "saving body" do
     message = Message.create(subject: "Greetings", body: "<h1>Hello world</h1>")
     assert_equal "Hello world", message.body.to_plain_text
   end
+
+  test "saving content via nested attributes" do
+    message = Message.create! subject: "Greetings", content: "<h1>Hello world</h1>",
+      review_attributes: { author_name: "Marcia", content: "Nice work!" }
+    assert_equal "Nice work!", message.review.content.to_plain_text
+  end
+
+  test "updating content via nested attributes" do
+    message = Message.create! subject: "Greetings", content: "<h1>Hello world</h1>",
+      review_attributes: { author_name: "Marcia", content: "Nice work!" }
+
+    message.update! review_attributes: { id: message.review.id, content: "Great work!" }
+    assert_equal "Great work!", message.review.reload.content.to_plain_text
+  end
 end
-- 
cgit v1.2.3