Как заставить Paper_trail работать с текстом действия?

У меня был Paper Trail Gem, хорошо настроенный с моей базовой моделью статьи, которая имела text столбец называется body. Однако после того, как я внедрил текст действия в свое приложение и удалил столбец body из модели статьи , Я не могу заставить Paper Trail отслеживать изменения в связанном столбце body. Как заставить это работать?

Отказ от ответственности: я новичок в Rails.

ст.рб

...
  has_rich_text :body
  has_paper_trail
...

Схема статей (после удаления столбца :body)

  create_table "articles", force: :cascade do |t|
    t.string "title"
    t.string "slug"
    t.datetime "archived_at"
    t.datetime "published_at"
    ...
  end

Схема текста действия

create_table "action_text_rich_texts", force: :cascade do |t|
    t.string "name", null: false
    t.text "body"
    t.string "record_type", null: false
    t.bigint "record_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
  end

Я хотел бы вернуть в приложение ту же функциональность, что и раньше, где я мог видеть изменения, внесенные в текст статьи. Например. кто-то добавил предложение, удалил слово и т.д..


person Marek Dlugos    schedule 06.04.2019    source источник
comment
есть ли в наличии модель ActionTextRichText? если да, то, возможно, вы можете добавить к нему has_paper_trail   -  person mr_sudaca    schedule 06.04.2019
comment
@mr_sudaca Модель недоступна.   -  person Marek Dlugos    schedule 08.04.2019


Ответы (5)


Объединение ответов сработало для меня:

# frozen_string_literal: true

ActiveSupport.on_load(:action_text_rich_text) do
  ActionText::RichText.class_eval do
    has_paper_trail
  end
end

в lib/rich_text_paper_trail.rb и убедитесь, что этот файл загружен! Например, явно требуя этого: require 'rich_text_paper_trail'

person CUnknown    schedule 29.04.2020
comment
Где именно это потребуется? - person Jake Smith; 14.05.2020
comment
Я потребовал его в модели, в которой смонтирован action_text has_rich_text, но я думаю, что он также может потребоваться в application_controller.rb или в чем-то более глобальном. Возможно, вы также могли бы поместить этот код в файл инициализатора в config/initializers/ - person CUnknown; 15.05.2020

Попробуйте добавить файл config/initializers/rich_text_paper_trail.rb с помощью:

ActiveSupport.on_load(:action_text_rich_text) do
  has_paper_trail
end
person Javan    schedule 08.05.2019
comment
Не сработало. Новые версии (обновления или создания) не сохраняются в таблице versions. - person Marek Dlugos; 12.05.2019

Попробовав все варианты, представленные здесь, у меня появилась идея для этого обходного пути, который в конце концов сработал очень хорошо.

Я просто заменил Action Text чистой версией Trix Editor и поэтому я смог сохранить :body в моей модели article.rb, сохранить версии всего объекта и показать различия. Ура! ????

person Marek Dlugos    schedule 12.05.2019
comment
Как вы работали с частью вложений ActiveStorage? - person Nick M; 12.03.2020

Ruby позволяет вам (к лучшему или к худшему) вносить изменения на лету.

Поместите это в инициализатор:

ActionText::RichText.class_eval do 
  has_paper_trail
end 
person Josh Brody    schedule 06.04.2019
comment
Я пытался, но теперь я даже не могу запустить rails server, потому что получаю: ...gems/activerecord-5.2.2/lib/active_record/dynamic_matchers.rb:22:in `method_missing': undefined method `has_many_attached' for #<Class:0x00007fa19c03afd0> (NoMethodError) - person Marek Dlugos; 08.04.2019
comment
попробуйте создать и поместить его в app/models/action_text/rich_text.rb - person Josh Brody; 08.04.2019
comment
Я бы получил: Circular dependency detected while autoloading constant ActionText::RichText - person Marek Dlugos; 09.04.2019
comment
Вы можете попробовать поместить это в инициализатор и обернуть его в ActiveSupport.on_load(:active_storage_blob) do ... end - person Alex; 02.09.2019

Мы сделали что-то подобное в Rails 5.2, используя архивную версию активного текста.

Gemfile

gem 'actiontext', git: 'https://github.com/kobaltz/actiontext.git', branch: 'archive', require: 'action_text'

модели/статья.рб

class Article < ApplicationRecord
  has_paper_tail
  serialize :body, ActionText::Content
  ...
end

помощники/trix_editor_helper.rb

require 'action_view/helpers/tags/placeholderable'

module TrixEditorHelper
  mattr_accessor(:id, instance_accessor: false) { 0 }

# Returns a +trix-editor+ tag that instantiates the Trix JavaScript editor as well as a hidden field
# that Trix will write to on changes, so the content will be sent on form submissions.
#
# ==== Options
# * <tt>:class</tt> - Defaults to "trix-content" which ensures default styling is applied.
#
# ==== Example
#
#   rich_text_area_tag "content", message.content
#   # <input type="hidden" name="content" id="trix_input_post_1">
#   # <trix-editor id="content" input="trix_input_post_1" class="trix-content" ...></trix-editor>

  def trix_editor_tag(name, value = nil, options = {})
    options = options.symbolize_keys

    options[:input] ||= "trix_input_#{TrixEditorHelper.id += 1}"
    options[:class] ||= "trix-content"

    options[:data] ||= {}
    options[:data][:direct_upload_url] = main_app.rails_direct_uploads_url
    options[:data][:blob_url_template] = main_app.rails_service_blob_url(":signed_id", ":filename")

    editor_tag = content_tag("trix-editor", "", options)
    input_tag = hidden_field_tag(name, value, id: options[:input])

    input_tag + editor_tag
  end
end

module ActionView::Helpers
  class Tags::TrixEditor < Tags::Base
    include Tags::Placeholderable
    delegate :dom_id, to: ActionView::RecordIdentifier

    def render
      options = @options.stringify_keys
      add_default_name_and_id(options)
      options['input'] ||= dom_id(object, [options['id'], :trix_input].compact.join('_')) if object
      @template_object.trix_editor_tag(options.delete("name"), editable_value, options)
    end

    def editable_value
      value&.try(:to_trix_html)
    end
  end

  module FormHelper
    def trix_editor(object_name, method, options = {})
      Tags::TrixEditor.new(object_name, method, self, options).render
    end
  end

  class FormBuilder
    def trix_editor(method, options = {})
      @template.trix_editor(@object_name, method, objectify_options(options))
    end
  end
end

Затем мы установили trix версии 1.1 с cdn и использовали стандартный trix-attachments.js и прямую загрузку.

Хотите перейти на Rails 6 и сохранить эту концепцию, если это возможно.

person TheRealNeil    schedule 06.07.2020