Как настроить ActionText в администрировании (Rails 6.1)

#ruby-on-rails #actiontext #administrate

Вопрос:

Я пытаюсь настроить текст действий внутри панели администрирования. Я следовал инструкциям по установке на странице Обзора направляющих направляющих Rails. Затем при попытке добавить атрибут в /приложение/панели мониторинга/lesson_dashboard.rb я получаю ошибки.

Когда я пытаюсь body: Field::RichText , я получаю: uninitialized constant Administrate::Field::RichText

Когда я пытаюсь body: ActionText::RichText , я получаю: wrong number of arguments (given 4, expected 0..1) .

Когда я следую инструкциям в Вики-администрировании, я получаю undefined method 'body' , когда он доходит до строки С. <%= f.rich_text_area field.attribute %>

Есть идеи, как называется этот атрибут или почему я получаю эти ошибки?

приложение/панели мониторинга/lesson_dashboard.rb:

 require "administrate/base_dashboard"

class LessonDashboard < Administrate::BaseDashboard
  # ATTRIBUTE_TYPES
  # a hash that describes the type of each of the model's fields.
  #
  # Each different type represents an Administrate::Field object,
  # which determines how the attribute is displayed
  # on pages throughout the dashboard.
  ATTRIBUTE_TYPES = {
    course: Field::BelongsTo,
    documents: Field::ActiveStorage.with_options(
      show_display_preview: false,
      destroy_url: proc do |namespace, resource, document|
        [:delete_document_course, resource, { document_id: document.id }]
      end
    ),
    id: Field::Number,
    title: Field::String,
    # body: Field::Text,
    body: RichTextAreaField,
    created_at: Field::DateTime,
    updated_at: Field::DateTime,
  }.freeze

  # COLLECTION_ATTRIBUTES
  # an array of attributes that will be displayed on the model's index page.
  #
  # By default, it's limited to four items to reduce clutter on index pages.
  # Feel free to add, remove, or rearrange items.
  COLLECTION_ATTRIBUTES = %i[
    title
    course
  ].freeze

  # SHOW_PAGE_ATTRIBUTES
  # an array of attributes that will be displayed on the model's show page.
  SHOW_PAGE_ATTRIBUTES = %i[
    course
    title
    body
    documents
    created_at
    updated_at
  ].freeze

  # FORM_ATTRIBUTES
  # an array of attributes that will be displayed
  # on the model's form (`new` and `edit`) pages.
  FORM_ATTRIBUTES = %i[
    course
    title
    body
    documents
  ].freeze

  # COLLECTION_FILTERS
  # a hash that defines filters that can be used while searching via the search
  # field of the dashboard.
  #
  # For example to add an option to search for open resources by typing "open:"
  # in the search field:
  #
  #   COLLECTION_FILTERS = {
  #     open: ->(resources) { resources.where(open: true) }
  #   }.freeze
  COLLECTION_FILTERS = {}.freeze

  # Overwrite this method to customize how lessons are displayed
  # across all pages of the admin dashboard.
  def display_resource(lesson)
    lesson.title
  end

  # permitted for has_many_attached
  def permitted_attributes
    # super   [:attachments => []]
    super   [:documents => []]
  end

end
 

приложение/модели/урок.rb:

 class Lesson < ApplicationRecord

  belongs_to :course
  has_many_attached :documents

  validates :title, presence: true

end
 

Комментарии:

1. Я не являюсь администратором, но некоторые случайные поисковые запросы указывают на то, что вам нужно создать свой собственный тип поля для поддержки расширенного текста / ActionText. Помогает ли это вообще?

2. Я этого не нашел, спасибо за ссылку. Но следование ему только приводило меня к разным ошибкам. Я обновил вопрос.

3. Не могли бы вы отредактировать свой вопрос, чтобы добавить код lesson_dashboard.rb и Lesson модель? Просто для развлечения я создал проект scratch Rails и прошел через руководство по ActionText и администрированию, и это сработало для меня.

4. Я добавил код. Каким руководством вы пользовались?

Ответ №1:

В руководстве ActionText и справке по администрированию есть информация, но она несколько разрознена на нескольких страницах, поэтому я набросал шаги, которые я использовал в новом приложении Rails 6.1.

Эти шаги предполагают, что вы настроили ActionText (запустите rails g action_text:install и запустите результирующие миграции) и установили/настроили administrate gem.

  1. Для редактора расширенного текста Trix требуется Javascript, который в Rails 6 загружается с webpack. Макет администрирования по умолчанию не подходит для веб-пакетов, поэтому вам необходимо настроить макет. Создание макетов для настройки:
   % rails generate administrate:views:layout
 
  1. Добавьте a javascript_pack_tag views/layouts/admin/application.html.erb , чтобы загрузить пакет приложений:
 <head>
...
  <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  <%= render "stylesheet" %>
  <%= csrf_meta_tags %>
...
</head>
 

В руководстве по администрированию вы создадите отдельный пакет для администрирования JS, но он требуется только в том случае, если вам нужно настроить JS (например, для использования flatpickr в качестве средства выбора даты). Для простого использования RichText это не требуется, поэтому мы просто загружаем основной пакет приложений.

  1. Вам также необходимо настроить администрирование CSS для добавления стилей Trix. Запустите задачу для создания пользовательских таблиц стилей администрирования:
 % rails generate administrate:assets:stylesheets
 
  1. Редактировать администрировать таблицы стилей, чтобы включить стили для элементов управления Trix rich text внизу:
 // Rest of file
...
@import "trix/dist/trix";
@import "selectize";

.trix-content {
  .attachment-gallery {
    > action-text-attachment,
    > .attachment {
      flex: 1 0 33%;
      padding: 0 0.5em;
      max-width: 33%;
    }

    amp;.attachment-gallery--2,
    amp;.attachment-gallery--4 {
      > action-text-attachment,
      > .attachment {
        flex-basis: 50%;
        max-width: 50%;
      }
    }
  }

  action-text-attachment {
    .attachment {
      padding: 0 !important;
      max-width: 100% !important;
    }
  }
}

.field-unit--rich-text-area-field {
  .field-unit__field {
    width: 80%;
  }
}
 
  1. Добавьте пользовательский тип поля для редактирования форматированного текста, так как Administrate не включает поле «из коробки».
 % rails g administrate:field rich_text_area
 
  1. Измените тип поля ввода, fields/rich_text_area/_form.html.erb чтобы использовать элемент управления форматированным текстом Trix:
 <div class="field-unit__field">
  <%= f.rich_text_area field.attribute %>
</div>
 
  1. Отредактируйте свою модель, чтобы добавить атрибут форматированного текста:
 class Lesson < ApplicationRecord
  has_rich_text :body
end
 
  1. Создайте панель мониторинга для своей модели:
 % rails generate administrate:dashboard Lesson
 
  1. Измените тип поля dashboards/lesson_dashboard.rb , чтобы использовать пользовательский тип поля:
   ATTRIBUTE_TYPES = {
    ...
    rich_text_body: RichTextAreaField,
  }.freeze
 
  1. Прибыль:
    введите описание изображения здесь

Комментарии:

1. Я отметил это как правильный ответ, поскольку он решает проблему, которую я задал …но содержание тела, которое было на существующих уроках, не отображается. Я могу сохранить новое содержимое тела, поэтому я знаю, что оно работает, но как я могу поместить все старое содержимое в тело редактора Trix? Возможно, стоит добавить к ответу для потомков. В любом случае, спасибо за твою помощь, Роб.

2. Возможно, у вас изначально был body атрибут непосредственно на Lesson модели? ActionText хранит has_rich_text большие двоичные объекты в отдельной таблице. Ничто не мешает вашей модели иметь атрибут с тем же именем, что и у вашего большого двоичного объекта, но ActionText переопределяет метод доступа. Если это ваша ситуация, вы, вероятно, можете просто загрузить значение атрибута старой модели и повторно сохранить его (или написать миграцию для этого).